thisの値はいったい何ですか?
2666 ワード
まずこの文章を説明します.知っている上で見た大神さんがjsの中でthisを解読しています.はっきり言っています.保存して皆さんと共有してください.私の転載を許してください.
このようなJSの面接問題に遭遇したことがあるかもしれません.
初心者はthisについてよく分かりません.今日はこの文章をもう一度はっきり説明します.
関数の呼び出し
まず関数の呼び出しから話す必要があります.
JS(ES 5)には3つの関数があります.
この文章を見てから、必ず覚えてください.第三の呼び出し形式こそ、正常な呼び出し形式です.
これまでの関数の呼び出しは形式だけです.
thisとは、上のコードのcontextです.こんなに簡単です
thisはあなたが関数をcallした時に伝えるcontextです.これまでcall形式の関数で呼び出されたことがないので、ずっと知らなかったです.
まずfunc(p 1,p 2)の中のthisを見てどうやって確定しますか?
あなたが下記のコードを書く時
もしあなたが伝えたcontextがnullまたはundefinedであれば、windowオブジェクトはデフォルトのcontextです.(厳密なモードではデフォルトのcontextはundefinedです.)
だから上のプリント結果はwindowです.
ここのthisがwindowではないことを望むなら、簡単です.
タイトルに戻る: thisはあなたが一つの関数をコールした時に、最初に入ってきたパラメータです.(必ず暗記してください.「thisはcallの最初のパラメータです」 あなたの関数呼び出し形式がコール形式ではない場合、「変換コード」に従ってコール形式に変換してください.
原文:https://zhuanlan.zhihu.com/p/23804247
このような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 :)
締め括りをつける原文:https://zhuanlan.zhihu.com/p/23804247