thisの値はいったい何ですか?

2666 ワード

まずこの文章を説明します.知っている上で見た大神さんがjsの中でthisを解読しています.はっきり言っています.保存して皆さんと共有してください.私の転載を許してください.
    このようなJSの面接問題に遭遇したことがあるかもしれません.
var obj = {
  foo: function(){
    console.log(this);
  }
}

var bar = obj.foo;
obj.foo(); //      this   obj
bar(); //      this   window
最後の2行の関数の値がなぜ違っているか説明してください.
初心者はthisについてよく分かりません.今日はこの文章をもう一度はっきり説明します.
関数の呼び出し
まず関数の呼び出しから話す必要があります.
JS(ES 5)には3つの関数があります.
func(p1, p2);
obj.child.method(p1, p2);
func.call(context, p1, p2); //     apply
一般的に、初心者は前の2つの形を知っています.前の2つの形は「より優れている」と思います.
この文章を見てから、必ず覚えてください.第三の呼び出し形式こそ、正常な呼び出し形式です.
func.call(context, p1, p2);
他の2つは文法飴で、等価的にコール形式になります.
func(p1, p2); //   
func.call(undefined, p1, p2);

obj.child.method(p1, p2);  //   
obj.child.method.call(obj.child, p1, p2);
メモしてください.(私たちはこのコードを「変換コード」と呼びます.以下の引用に便利です.)
これまでの関数の呼び出しは形式だけです.
func.call(context, p1, p2);
このように、thisは説明しやすいです.
thisとは、上のコードのcontextです.こんなに簡単です
thisはあなたが関数をcallした時に伝えるcontextです.これまでcall形式の関数で呼び出されたことがないので、ずっと知らなかったです.
まずfunc(p 1,p 2)の中のthisを見てどうやって確定しますか?
あなたが下記のコードを書く時
function func(){
  console.log(this);
}

func();
に等しい
function func(){
  console.log(this);
}

func.call(undefined); //       func.call()
本来ならば印刷されたthisはundefinedでしょう.しかし、ブラウザにはルールがあります.
もしあなたが伝えたcontextがnullまたはundefinedであれば、windowオブジェクトはデフォルトのcontextです.(厳密なモードではデフォルトのcontextはundefinedです.)
だから上のプリント結果はwindowです.
ここのthisがwindowではないことを望むなら、簡単です.
func.call(obj); //       this    obj    
Obj.Child.method(p 1,p 2)のthisはどうやって確定しますか?
var obj = {
  foo: function(){
    console.log(this);
  }
}

obj.foo() ;
「変換コード」に従い、Obj.foo()を「変換コード」に変換します.
obj.foo.call(obj);
はい、thisはobjです.片付く
タイトルに戻る:
var obj = {
  foo: function(){
    console.log(this);
  }
}

var bar = obj.foo;
obj.foo(); //     obj.foo.call(obj),this    obj
bar(); 
//     bar.call()
//       context
//    this    undefined
//              this —— window   
[]文法
function fn (){ 
    console.log(this); 
}
var arr = [fn, fn2];
arr[0](); //      this      ?
私たちはarr[0]()をarr.0()と想像できます.後者の文法は間違っていますが、フォームは変換コードのObj.child.method(p 1,p 2)に対応しています.
arr[0](); //       
arr.0();  //      
arr.0.call(arr); //      this    arr   :)
締め括りをつける
  • thisはあなたが一つの関数をコールした時に、最初に入ってきたパラメータです.(必ず暗記してください.「thisはcallの最初のパラメータです」
  • あなたの関数呼び出し形式がコール形式ではない場合、「変換コード」に従ってコール形式に変換してください.
  •  
    原文:https://zhuanlan.zhihu.com/p/23804247