具体的な応用においては、関数の定義時点では決定できませんが、実行環境に応じて大きく以下の3つに分けられます。関数は通常の関数として使用されます。関数が呼び出された場合、this はグローバル オブジェクトを指します
2。関数がオブジェクトのメソッドとして呼び出された場合、this はオブジェクトを指します
3。コンストラクター。これは新しく作成されたオブジェクトを指します
例 1:
window.name = 'myname'; function getName() { console.log(this.name); } getName(); //输出myname
例 2:
var boy = { name: 'Bob', getName: function() { console.log(this.name); } } boy.getName(); //输出Bob
例 3:
function Boy(name) { this.name = name; } var boy1 = new Boy('Bob'); console.log(boy1.name); //输出Bob
例 3 には、別の特殊なケースがあります。つまり、コンストラクターが を通じてオブジェクトを返す場合です。 「return」、この操作の最終結果は、新しく作成されたオブジェクトではなく、このオブジェクトを返すため、この場合はほとんど役に立ちません。
例 4:
function Boy(name) { this.name = name; return { //返回一个对象 name: 'Jack' } } var boy1 = new Boy('Bob'); console.log(boy1.name); //输出Jack
例 5:
function Boy(name) { this.name = name; return 1; //返回非对象 } var boy1 = new Boy('Bob'); console.log(boy1.name); //输出Bob
call と apply
apply の役割は 2 つのパラメーターを受け取り、最初のパラメーターは関数本体内の this のポインターを指定し、2 番目のパラメーターは配列または配列です。例: 呼び出された関数を渡すために使用されるパラメーター リスト。
例 1:
function getInfo() { console.log(this.name+' like '+arguments[0]+' and '+arguments[1]); } var boy1 = { name: 'Bob', age: 12 } getInfo.apply(boy1,['sing','swimming']); //输出Bob like sing and swimming
call 渡されるパラメータの数は固定ではありません。 apply と同様に、最初のパラメータは関数本体での this のポイントを指定するために使用されます。2 番目のパラメータから始めて、各パラメータが渡されます。呼び出された関数に順番にアクセスします。
例 2:
function getInfo() { console.log(this.name+' like '+arguments[0]+' and '+arguments[1]); } var boy1 = { name: 'Bob', age: 12 } getInfo.call(boy1,'sing','shopping'); //输出Bob like sing and shopping
さらに、ほとんどの高度なブラウザでも、bind メソッドが実装されています。call および apply との違いは、bind は関数内で this のポインタを変更するだけで、すぐには実行されないことです。明示的に呼び出す必要があります。
例 3: ブラウザのバインドメソッドをシミュレートする
Function.prototype.bind = function(obj){ var self = this; return function(){ return self.apply(obj,arguments); } }; var obj = { name: 'Bob', age: 12 }; var func = function(){ console.log(this.name+' like '+arguments[0]+' and '+arguments[1]); }.bind(obj); func('sing','shopping');
これを失った
場合によっては、this のポイントが失われます。このとき、this のポイントを変更するには、call、apply、bind を使用する必要があります。
例 1: "getName" メソッドが "boy" オブジェクトのプロパティとして呼び出された場合、別の変数が "getName" メソッドを参照すると、通常どおり呼び出されるため、これは "boy" オブジェクトを指します。関数の場合、これはグローバルオブジェクトのウィンドウを指します
var boy = { name: 'Bob', getName: function() { console.log(this.name); } } boy.getName(); //输出Bob var getBoyName = boy.getName; getBoyName(); //输出undefined
例2: 関数内で関数が定義されていても、通常のオブジェクトとして呼び出された場合、これもウィンドウオブジェクトを指します
var boy1 = { name: 'Bob', age: 12, getInfo: function() { console.log(this.name); function getAge() { console.log(this.age); } getAge(); } } boy1.getInfo(); //Bob //undefined
上記は私がコンパイルしたものです将来すべての人にとって役立つことを願っています。
関連記事:
NodeJS親プロセスと子プロセス間のリソース共有手順を詳しく解説JS匿名自己実行関数の概念と使い方QR生成方法のJS解析リンクからのコード画像以上がJS での this の指定と call と apply の関数 (グラフィック チュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。