JavaScript处理这个问题的机制与其他语言完全不同。在五种不同的情况下,这指向不同的东西。
有句话说得很有道理——谁叫它,这就指向谁
首先,在全球范围内
在全局范围内使用它,它将指向全局对象(浏览器中的窗口)
var name=' name1console.log(名称);this.name=' name2console.log(名称);console . log(this . name);window.name=' name3console.log(名称);console . log(this . name);console . log(window . name);
二、函数调用
直接调用一个函数,默认会指向整个世界(浏览器端的窗口)
var name=' name1函数SayName(){ console . log(name);console.log(此);} SayName();window . SayName();可以看到
还有几种常见的情况。按照谁调用方法就指向谁的原则,这个方向要仔细研究
//global name var name=' name 1 ';Varobj={name:' name2 ',say name 3360 function(){//调用时,这指向全局return function(){ console . log(this . name);};},changeName:函数(){ //调用它时,这指向全局settimeout (function () {this。名称=' name3},0);}};obj . SayName()();obj . changename();setTimeout(function(){ console . log(name);console . log(obj . name);},0);
与这些匿名函数一样,默认情况下,它们都由全局(浏览器下的窗口)对象调用。为了正确地调用obj,有必要很好地引用它们
您可以在进入下一步之前使用它来保持这一点,或者通过匿名函数传递值,或者使用调用/应用/绑定来更改上下文等。
var name=' name1var obj={ name: 'name2 ',SayName : function(){ var that=this;return function(){ console . log(that . name);};},changeName:函数(){ var即=thissetTimeout(function(){ that . name=' name 3 ';},0);}};obj . SayName()();//name2obj . changename();setTimeout(function(){ console . log(name);//name 1 console . log(obj . name);//name3},0);第三,对象方法的调用
其实和上面提到的obj.sayName() obj.name等类似
此时,这将指向该对象
四.调用/应用/绑定
当使用Function.prototype上的调用或apply、bind方法时,函数中的这个参数将被显式设置为函数调用的第一个参数。
具体使用方法
我们可以稍微修改一下上面的代码,我们可以看到由此带来的变化
var name=' name1Varobj={name:' name2 ',say name 3360 function(){//返回默认全局函数return function(){ console . log(this . name);};},changeName:函数(){ //返回一个默认的全局函数settimeout (function () {this。名称=' name3//然后将此函数绑定到此(当前obj对象)}。bind(this),0);}};//obj.sayName(),让obj调用obj.sayName()。呼叫(obj);//让这个(也就是全局对象)调用obj.sayName()。应用(这个);obj . changename();SetTimeout(函数(){ //更改后输出全局名的值console . log(name);//更改后输出obj对象中name的值console . log(obj . name);},0);
动词(verb的缩写)作为构造函数调用
例如,new Foo();
让我们从一个简单的例子开始:
var name=' name1函数Foo(){ //将此(当前对象)的名称属性值赋给this.name=' name2}//新构造函数生成一个实例var Foo=new Foo();console.log(名称);console . log(foo . name);//直接调用函数Foo();console.log(名称);
可以看出,如果一个函数倾向于和new关键字一起使用,我们称之为构造函数,当new结束时,这就指向了这个心创建的对象(new的过程其实涉及到继承机制)。
如果直接调用这个函数,默认情况下会执行全局对象。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。