これはjsでは一体何でしょうか?
関数が呼び出されると、セッション レコードが作成されます。メソッドによって渡されるパラメーターとその他の情報を記録します。これは属性の 1 つにすぎず、関数の実行時に使用されます。
この拘束ルール (覚えておいてください)
1. 函数是否在 new 中调用(new 绑定)?如果是的话 this 绑定的是新创建的对象。
2. 函数是否通过 call、apply(显式绑定)或者硬绑定调用?如果是的话,this 绑定的是指定的对象。
3. 函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this 绑定的是那个上
下文对象。(特征对象 包括普通对象 实例对象 函数对象)
4. 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到 undefined,否则绑定到全局对象。
特別付録
1. アロー関数
本身是没有this 属性的,由创建时候的词法作用域决定的。不受调用对象的影响 ,受上级的词法作用域影响
例子:
var age = 100
let obj = {
name:'obj',
age:20,
showName:function(){
// this 指 小p
return ()=>{
// 这里的this 就是小P
console.log(this.name)
}
},
showAge:()=>{
console.log(this.age)
}
}
obj.showName()()// 这时候 小P 属于上下文对象 中 this 所以就是对象本身 就是obj this.name 就是obj
obj.showName.call({
name:'call'})()//属于 强绑定 this 就是 {name:'call'}
obj.showAge()// this 就是全局对象
2. 関数への間接参照 この関数を呼び出すと、デフォルトのルールが適用されます。
function foo() {
console.log( this.a );
}
var a = 2;
var o = {
a: 3, foo: foo };
var p = {
a: 4 };
o.foo(); // 3
(p.foo = o.foo)(); // 2
練習する
var name = 'window'
var person1 = {
name: 'person1',
foo1: function () {
console.log(this.name)
},
foo2: () => console.log(this.name),
foo3: function () {
// 这里this 是 小foo3
return ()=> {
console.log(this.name)
}
},
foo4: function () {
return function() {
console.log(this.name)
}
}
}
var person2 = {
name: 'person2' }
// 开始题目:
person1.foo1();//上下文对象 person1
person1.foo1.call(person2);//强关联对象 person2
person1.foo2();//箭头函数的上级词法作用域绑定 this 满足4 默认规则 window
person1.foo2.call(person2);//call 方法没有改变 箭头函数的上级词法作用域(全局作用域)所以还是 window
person1.foo3()();// 箭头函数上级词法作用域 就是 小foo3(上下文对象) 所以this就是 person1
person1.foo3.call(person2)();//这里强绑定改变了 小foo3 的指向 (person2)所以this 就是 person2
person1.foo3().call(person2);// 这里同上 没有改变 箭头函数的上级词法作用域 所以 this 还是 person1
person1.foo4()();//属于规则4 window
person1.foo4.call(person2)();//属于规则4 window
person1.foo4().call(person2);// 属于规则2 强绑定 person2