1。这指向构造函数实例化的对象。

在最后一篇文章中,我们提到了使用新构造函数和调用构造函数而不使用新的区别,如下所示:

复制代码代码如下所示:

函数本杰明(用户名,性别){

this.username =用户名;

this.sex =性;

}

Var Benjamin =新本杰明(zuojj

输出:本杰明{性别:男性

console.log(本杰明);

Var Ben =本杰明(zhangsan

输出:未定义

console.log(本);



当构造函数被调用为普通函数时,它不会返回一个值,而这指向全局对象,那么我们如何避免由于新关键字的缺乏而导致的问题呢

复制代码代码如下所示:

函数本杰明(用户名,性别){

检查是否为本杰明对象

如果(这是本杰明){

this.username =用户名;

this.sex =性;

{ }人

返回新本杰明(用户名,性别);

}

}

Var Benjamin =新本杰明(zuojj

输出:本杰明{性别:男性

console.log(本杰明);

Var Ben =本杰明(zhangsan

/ /输出:本杰明{用户名:zhangsan

console.log(本);



在这种情况下,我们首先检查是否这是哥杰明,例如果不使用新的自动调用构造函数,并实例化,这意味着我们不再需要担心错过新的关键字实例化构造函数。当然,我们可能会养成一个坏习惯,如果它是可以避免的。我们可以抛出一个错误,如下:

复制代码代码如下所示:

函数本杰明(用户名,性别){

检查是否为本杰明对象

如果(这是本杰明){

this.username =用户名;

this.sex =性;

{ }人

如果没有,抛出错误。

抛出新的错误('本杰明'调用没有'新' ');

}

}



二,这指向调用函数的对象。

请看下面的例子:

复制代码代码如下所示:

变量x=10;

var obj = { {

X:10,

输出:函数(){

输出:真的

console.log(= obj);

返回这个;

},

Innerobj:{

X:30,

输出:函数(){

输出:真的

console.log(= obj。innerobj);

返回这个;

}

}

};

输出:10

console.log(obj.output());

输出:30

console.log(obj.innerobj.output());



三,这指向全局对象。

当我们讨论构造函数时,我们还讨论了当这个不适合新的时候,它指向全局对象。现在让我们来看一下容易犯错误的两个常见例子。

复制代码代码如下所示:

变量x=100;

var obj = { {

X:10,

输出:函数(){

(函数(){())

输出:真的

console.log(=窗口);

输出:内部:100

console.log(内在:+,X);

});



返回这个;

}

};

输出:10

console.log(obj.output());



使用闭包时,作用域会改变,这指向窗口(在浏览器中)。

复制代码代码如下所示:

变量x=100;

var obj = { {

X:10,

输出:函数(){

返回这个;

}

};

无功输出= obj.output;

输出:10

console.log(obj.output());

输出:100

console.log(输出());

var obj2 = { {

X:30,

输出:obj.output

}

输出:30

console.log(obj2.output());



在这一点上,当函数调用被调用时,总是指向对象。

四,这指向应用调用()方法分配的对象。



复制代码代码如下所示:

变量x=100;

var obj = { {

X:10,

输出:函数(){

返回这个;

}

};

输出:10

console.log(obj.output());

var obj2 = { {

X:40,

输出:obj.output

}

输出:40

console.log(obj.output.call(obj2));

输出:10

console.log(obj2.output.apply(obj));



五,回调函数中的这个值指向调用回调函数的这个对象所指向的对象。

复制代码代码如下所示:



$(#用户名),(单击

console.log(的价值);

});



六,这在Function.prototype.bind

绑定()方法创建一个新函数,当调用、调用时,它也被称为正确和错误。

例1:

复制代码代码如下所示:

功能人(){

返回this.name;

}

/ / function.prototype.bind

每person.bind({ var =

名称:zuojj

});

console.log(每);

var obj = { {

姓名:本

人:人,

单位:元

};

/ /输出:本,zuojj

console.log(obj.person(),obj.per());



例二:

复制代码代码如下所示:

这个,x=9;

var模块{ {

X:81,

GetX:函数(){退货。X;}

};

输出:81

console.log(module.getx());

VaR模拟X = module.getx;

输出:9,因为在这种情况下,指的是全局对象。

console.log(getX);

创建一个新的功能with'this ' /绑定模块

无功boundgetx = getx.bind(模块);

输出:81

console.log(boundgetx());