首先,您需要清楚地了解这个关键字在范围上下文中的范围和行为。
此范围(&S):
JavaScript中有两种类型的作用域。他们是:
全球范围功能范围
简而言之,全局范围是指窗口对象。全局范围中声明的变量可以从任何地方访问。
另一方面,函数范围位于函数内部。在函数内部声明的变量通常无法从外部世界访问。
全局范围中的this关键字引用窗口对象。函数内部的这个也指窗口对象。因此,这将始终引用窗口,直到我们找到一种方法来处理它,以指示我们自己选择的上下文。
--------------------------------------------------------------------------------
- -
- Global Scope -
- (globally "this" refers to window object) -
- -
- function outer_function(callback){ -
- -
- // Outer function scope -
- // Inside the outer function, the "this" keyword -
- // refers to window object -
- callback() // "this" inside callback also refers to the window object -
- } -
- -
- function callback_function(){ -
- -
- // Function to be passed as callback -
- -
- // Here "THIS" refers to the window object also -
- } -
- -
- outer_function(callback_function) -
- // Invoke with callback -
- -
--------------------------------------------------------------------------------
在回调函数中操作此函数的不同方法:
这里有一个名为Person的构造函数。它有一个名为name的属性和四个名为sayNameVersion1、sayNameVersion 2、sayName Version3和sayNameversion 4的方法。他们四人都有一项具体任务。接受回调并调用它。回调有一个特定的任务,即记录Person构造函数实例的name属性。
function Person(name){
this.name = name
this.sayNameVersion1 = function(callback){
callback.bind(this)()
}
this.sayNameVersion2 = function(callback){
callback()
}
this.sayNameVersion3 = function(callback){
callback.call(this)
}
this.sayNameVersion4 = function(callback){
callback.apply(this)
}
}
function niceCallback(){
// Function to be used as callback
var parentObject = this
console.log(parentObject)
}
现在,让我们从person构造函数创建一个实例,并使用niceCallback调用不同版本的sayNameVersionX(X引用1,2,3,4)方法,以了解我们可以用多少种方式操纵这个内部回调来引用person实例。
var p1 = new Person('zami') // Create an instance of Person constructor
绑定:
bind所做的是创建一个新函数,将此关键字设置为所提供的值。
sayNameVersion1和sayNameVersion 2使用bind来操纵回调函数的这一点。
this.sayNameVersion1 = function(callback){
callback.bind(this)()
}
this.sayNameVersion2 = function(callback){
callback()
}
第一个方法将其与方法本身内的回调绑定。对于第二个回调,将传递与之绑定的对象。
p1.sayNameVersion1(niceCallback) // pass simply the callback and bind happens inside the sayNameVersion1 method
p1.sayNameVersion2(niceCallback.bind(p1)) // uses bind before passing callback
电话:
调用方法的第一个参数在函数中用作此参数,该函数通过附加的调用进行调用。
sayNameVersion3使用调用来操纵this,以引用我们创建的person对象,而不是window对象。
this.sayNameVersion3 = function(callback){
callback.call(this)
}
其名称如下:
p1.sayNameVersion3(niceCallback)
应用:
与调用类似,apply的第一个参数引用将由this关键字指示的对象。
sayNameVersion4使用apply操作此对象以引用person对象
this.sayNameVersion4 = function(callback){
callback.apply(this)
}
它的名称如下。简单地传递回调,
p1.sayNameVersion4(niceCallback)