this 全面解析(一)

this关键字是JavaScript中最复杂的机制之一。是一个很特别的关键字,被定义在全部函数的做用域中。javascript

那么,咱们为何要使用this

function identify() {
   return this.name.toUpperCase(); 
}

function speak() {
    var greeting = 'Hello,I am' + identify.call(this);
    console.log( greeting )
}

var you = {
    name: 'Tom'
}

var me = {
    name: 'Jerry'
}

identify.call( me ); // Jerry
identify.call( you ); //Tom
speak.call( me ); // Hello I am JERRY
speak.call( you ); // Hello I am TOM
复制代码

以上代码看不懂没关系,如今须要知道的就是 this 隐式传递了一个对象引用,注意:通常咱们是显式的传递上下文对象,这会让咱们的代码变得愈来愈混乱,使用this则不会这样,自动引用合适的上下文是相当重要的。java

消除误解

有两种常见的解释,但他们都是错误的ide

指向自身?

英语语法里,this确实是指向自身,貌似是说的通的,函数

不过,咱们看下面的一个例子ui

function foo(num) {
    console.log( "foo: " + num );
    this.count++;
}

foo.count = 0;

var i;

for(let i=0; i<10; i++) {
    if(i > 5) {
        foo(i)
    }
}
console.log( foo.count ); // 0
复制代码

那么结果是什么呢? foo:6this

foo:7spa

foo:8code

foo:9对象

事实上,foo函数确实被调用了4次,可是 foo.count 仍是0!ip

说明:this指向自身,是错误的。

当执行foo.count = 0,是向foo添加了count属性,值为0,不过,函数内部的this并不指向那个函数对象

固然,不少开发者并不会试图去解决这些“艰难并且重要”的问题。而是回避,好比,再建立一个带有count属性的对象。

function foo(num) {
   console.log( "foo: " + num );
   data.count++;
}

var data = {
   count = 0
}

var i;

for(let i=0; i<10; i++) {
   if(i > 5) {
       foo(i)
   }
}
// foo:6
// foo:7
// foo:8
// foo:9
console.log( foo.count ); // 4
复制代码

问题解决了!可是却没有解决真正的问题---this的含义以及工做原理。

以上为从对象内部引用自身,只是用 this 是不够的,通常须要一个指向函数对象的变量引用它

函数分两种:具名函数 和 匿名函数

//具名函数 内部能够用函数名引用自身
function foo(){
    foo.count = 4;//foo 指向自身
}

setTimeout( function(){
    //匿名函数,没法指向自身
},10);
复制代码

指向它的做用域?

这种认识在某种状况下是正确的,可是其余状况下就全是错误的。

this在任何状况下都不指向函数的词法做用域。虽然在js内部,做用域和对象比较类似,可是做用域没法经过js代码访问,只存在于js引擎内部。

经典的错误!

function foo(){
    var a = 2;
    this.bar();
}

function bar(){
    console.log( this.a );
}

foo();//ReferenceError
复制代码

this 到底指什么???

接下来会继续与你们探讨 this 剑指何方。

相关文章
相关标签/搜索