var str="hello"; var obj={ str:"world", fun:function(){ alert(str); } } obj.fun(); //结果是hello
为什么结果是hello,而不是world
闭关修行中......
雷雷
因为你obj对象中写着的 str:"world",表示的是obj.str=“world”。这是是一个属性,不是一个变量。而你最后运行的obj.fun()里面弹出的是str变量,并不是属性(当然这个也是全局window的一个属性)。这么说你懂了吗。如果你alert this.str 或者obj.str都能得到"world"。
变量 str 其实是 window 的属性,和 obj 对象的 str 属性是没有关系的。这个不涉及作用域链问题,你理解的情况应该是下面这种:
var str="hello"; function change(){ str="world"; alert(str) } change();
这个例子中,函数 change 中先对 全局变量 str 重新赋值,要执行 alert(str) 时,就在自身的作用域链起点也就是自己的变量对象中寻找 str 这个变量,发现没有就接着往上一级寻找,找到了 str 变量,不过这时 str 已经被重新赋值为 world ,所以会弹出 world。
var str="hello"; var obj={ str:"world", fun:function(str){ console.log(window.str,this.str,str); } } obj.fun('!') //hello world !
懂了木有?
雷雷
雷雷
因为你obj对象中写着的 str:"world",表示的是obj.str=“world”。这是是一个属性,不是一个变量。而你最后运行的obj.fun()里面弹出的是str变量,并不是属性(当然这个也是全局window的一个属性)。这么说你懂了吗。如果你alert this.str 或者obj.str都能得到"world"。
变量 str 其实是 window 的属性,和 obj 对象的 str 属性是没有关系的。这个不涉及作用域链问题,你理解的情况应该是下面这种:
这个例子中,函数 change 中先对 全局变量 str 重新赋值,要执行 alert(str) 时,就在自身的作用域链起点也就是自己的变量对象中寻找 str 这个变量,发现没有就接着往上一级寻找,找到了 str 变量,不过这时 str 已经被重新赋值为 world ,所以会弹出 world。
懂了木有?