5分で完全理解の指さし問題(練習問題付き)

これは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

おすすめ

転載: blog.csdn.net/weixin_45485922/article/details/127649137