美文网首页
关于一道函数与变量声明赋值的题

关于一道函数与变量声明赋值的题

作者: twentyshaw | 来源:发表于2019-08-29 13:51 被阅读0次

今天做题的时候错了一道这样的题:

var foo = {n:1};
(function(foo){
    var foo; 
    console.log(foo.n);
    foo.n = 3;
    foo = {n:2};
    console.log(foo.n);
})(foo);
console.log(foo.n);

问:打印的结果
答案: 1 2 3


解析要点:

1. 变量的值——基本类型 与 引用类型

1.1 基本类型的值

  • 基本类型的值就是例如字符串,数值,布尔值这样的值
    比如var a = 1
  • 它的值直接存在栈内存里(关于栈内存请戳→栈内存与堆内存
  • 变量间的赋值:
var a = 1
var b = 2
b = a 

是直接把a对应的栈内存的值复制到b对应的栈内存里,覆盖掉原来的值。

1.2 引用类型的值

引用类型的值就例如:var c = {name:"xiaoc", age: 100}这种

  • 它的存储形式是:在栈内存中存一个地址,该地址指向堆内存中保存的值
  • 变量间的赋值
var c = {name:"xiaoc", age: 100}
var d = {name:"xiaod", age: 99}
d = c

它是直接把c对应的栈内存里的地址复制到d对应的栈内存里面,d以前的地址被覆盖,以前的地址对应的堆内存的内容,被垃圾回收机制清除掉

2. 变量的声明与赋值

var a = 1
var a 
console.log(a) //打印出 1

重复声明而没有赋值的语句会被忽略

3. 函数中形参和局部变量同名

在函数内部,会把形参和局部变量同名直接视为变量的重复声明。和上面那种情况一样。不过函数的参数只在函数内部有效。


所以,套用到题目中:

var foo = {n:1};
(function(foo){
    ......
    foo.n = 3; // 函数内部的foo的属性n的值被修改为3,因为地址相同,所以也就是修改了全局foo的属性n的值,变为3
    ......
})(foo);  // foo的值被传进函数里(此时函数里的foo与全局的foo的栈内存里的地址相同)
console.log(foo.n); //打印出全局foo的n的值,全局的地址没有变,只是在函数内部被改为了3,所以打印出3
(function(foo){
    ......
    foo.n = 3;
    ......
})(foo) //foo的值被传进函数里(此时函数里的foo与全局的foo的栈内存里的地址相同)
  1. var foo: 函数内部变量的重复声明 无效
  2. console.log(foo.n) : 打印出接收到的参数的值, 为 1
  3. foo.n = 3: 函数内部的foo的属性n的值被修改为3,因为地址相同,所以也就是修改了全局foo的属性n的值,变为3
  4. foo = {n:2}: 函数内部的foo的地址被修改,指向一个新的堆内存空间,这里存的是{n:2}
  5. console.log(foo.n): 打印出函数内部的foo的n的值,因为在上一句已经被改地址了,所以是2
  6. console.log(foo.n) : 打印出全局foo的n的值,全局的地址没有变,只是在函数内部被改为了3,所以打印出3

相关文章

  • 关于一道函数与变量声明赋值的题

    今天做题的时候错了一道这样的题: 问:打印的结果答案: 1 2 3 解析要点: 1. 变量的值——基本类型 与 引...

  • 理解执行上下文

    变量、函数表达式——变量声明,默认赋值undefined; this——赋值; 函数声明——赋值; 这三种数据的准...

  • 5.Go语言变量的基本用法

    变量的声明与赋值 单个变量的声明与赋值声明格式:var <变量名称> <变量类型>赋值格式:<变量名称> = <表...

  • 小公式语法

    关键字 变量声明 变量赋值 if 语句 for循环 函数声明

  • JS笔记 命名问题

    JS中函数和变量重名时,后声明的覆盖先声明的,后赋值的覆盖先赋值的。 变量提升和函数提升时,变量的声明是在函数的声...

  • Kotlin学习笔记 第一篇

    变量与函数 val:用于声明不可变的变量,这种变量在初始赋值之后就再也不能重新赋值,对应 Java 中的 fina...

  • js原生

    三种定义函数的方式 变量声明提升 在函数体内部,声明变量,会把该声明提升到函数体的最顶端。 只提升变量声明,不赋值...

  • golang入门之变量和常量

    一.定义变量 1.定义单个变量 完整模式: 注:方式1不能在函数外赋值, go不支持在函数外赋值与调用操作(在声明...

  • 2020-01-03培训

    函数 python变量没有声明变量,赋值与声明都是同一个语句可在函数里声明 密码加密 1.工具类公共工具类私有工具...

  • js的提升

    JavaScript 会将函数声明和变量声明提升到当前作用域的顶部。变量赋值不会提升。在脚本的顶部声明函数和变量,...

网友评论

      本文标题:关于一道函数与变量声明赋值的题

      本文链接:https://www.haomeiwen.com/subject/bofiectx.html