var a = 'global'; var obj = { a : 'local', test : function(){ function test1(){ alert(this.a);//global } alert(this.a);//local test1();//所有者是window } }; obj.test();
为什么第一个a弹出的值是global 它的this指向了window
是因为test1()函数的作用域属于全局作用域吗?为什么不是obj呢?
var a = 'global'; var obj = { a : 'local', test : function(){ function test1(){ alert(this.a);//global } alert(this.a);//local test1();//所有者是window } }; obj.test();
为什么第一个a弹出的值是global 它的this指向了window
是因为test1()函数的作用域属于全局作用域吗?为什么不是obj呢?
方法调用的时候,会有this指针的传递
例如:
a.doSomething();
那么,在doSomething这个函数域中,this指针指向的就是对象a
如果直接调用doSomething(),那么,this指针指向的是全局对象,即window
function test1(){ alert(this.a);//global }
上面格式的声明函数都是全局作用域
而
test1 = function() {} or {test1 : function() {}}
这种格式声明的函数则距具有和变量(属性)相同的作用域
JS中 所有的全局变量其实都是 global(浏览器就是window)对象的一个属性。
this的引用改变只有依靠 "." 操作符或函数的".apply()"或".call()"来改变。
全局变量(如:"var foo = 'bar';") 也可以被写成 "global.foo = 'bar';"
关键字this没有作用域限制,嵌套的函数不会从调用它的函数中继承this。如果嵌套函数作为方法调用,this指向调用他的对象,如果作为函数调用,this不是全局变量就是undefined(严格模式下)
this的指向是在执行的时候绑定的。this指向和函数调用的方式有关。obj.test()是test作为对象的方法调用的,所以test中的this指向这个对象,因此输出obj中的a;而test1()在虽然在test中执行,但是和作用域无关。作为函数直接调用的,所以这个this指向了window,因此输出window中的a。
《javascript高级程序设计》中有说到:this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象调用时,this等于那个对象。不过,匿名函数具有全局性,因此this对象同常指向window
不过针对于匿名函数this具有全局性的观点仍是有争议的,具体this作用域问题可参考
【Javascript】深入理解this作用域问题以及new运算符对this作用域的影响
13 回答12.8k 阅读
7 回答1.9k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答889 阅读✓ 已解决
6 回答1.1k 阅读
2 回答1.3k 阅读✓ 已解决
在Douglas Crockford的《JS语言精粹》中有讲到:
以此模式调用的函数,this被绑定到全局 对象。这是语言设计上的一个错误。
所以 test1()是函数调用模式,此时的this已经是window对象了。
可以参考this的问题