序文
コンテキスト、つまりコンテキスト、関数が実行されたときのコンテキスト、つまりコンテキストを変更するために、両方を呼び出して適用します。言い換えれば、関数本文内のこの方向を変えることです。
通話と適用の機能はまったく同じですが、パラメーターを受け入れる方法は異なります。
メソッド定義
適用する
Function.apply(obj,args)メソッドは2つのパラメーターを受信できます。
OBJ:このオブジェクトは、関数クラスでこのオブジェクトを置き換えます
args:これは配列またはクラスアレイです。適用メソッドは、このコレクションの要素を呼び出した関数のパラメーターとして渡します。
電話
コールメソッドの最初のパラメーターは、2番目のパラメーターがパラメーターリストであることを除いて、適用方法と同じです
非ストリクトモードでは、最初のパラメーターがnullまたは未定義として渡される場合、これは関数本文でデフォルトのホストオブジェクトを指し、ブラウザではウィンドウです
var test = function(){console.log(this === window);} test.apply(null); // truetest.call(undefined); // true使用法
他の人を「ハイジャック」する方法
この時点で、 FooのlognameメソッドはBarで参照されます。これはBarを指します
var foo = {name: "mingming"、logname:function(){console.log(this.name); }} var bar = {name: "xiaowang"}; foo.logname.call(bar); // xiaowang継承を実現します
function animal(name){this.name = name; this.showname = function(){console.log(this.name); }} function cat(name){animal.call(this、name); } var cat = new Cat( "Black Cat"); cat.showname(); //黒猫実際の開発では、これはしばしば不注意に変化するシナリオと遭遇します。
地元の楽しい方法があります。楽しさが通常の関数と呼ばれる場合、この内部の楽しみはウィンドウを指しますが、 #Testノードを指すことを望んでいます。次のコードを参照してください。
window.id = "window"; document.queryselector( '#test')。onclick = function(){console.log(this.id); // test var fun = function(){console.log(this.id); } fun(); // window}通話を使用すると、この問題を簡単に解決できます
window.id = "window"; document.queryselector( '#test')。onclick = function(){console.log(this.id); // test var fun = function(){console.log(this.id); } fun.call(this); // test}もちろん、これはこれを行うことができますが、 ECMAScript 5 Strictモードでは、この場合、これはグローバルオブジェクトを指し示すことはありませんが、未定義です。
window.id = "window"; document.queryselector( '#test')。onclick = function(){var that = this; console.log(this.id); // test var fun = function(){console.log(that.id); } fun(); // test} function func(){"strict" alert(this); // output:undefined} func();その他の使用法
クラスアレイ
ここで、次の条件を満たすオブジェクトはクラスアレイと呼ばれます
1。長さの属性を持っています
2。インデックスに従ってデータを保存します
3.アレイを持たないプッシュ、ポップ、その他の方法
クラスの一般的な配列には、引数とノデリストが含まれます!
(function(){array.prototype.push.call(arguments、4); console.log(arguments); // [1、2、3、4]})(1,2,3)このようにして、4を引数に押し込みます
Array.prototype.pushページは、2つの配列の組み合わせを実装できます
プッシュメソッドはアレイをプッシュすることはありませんが、プッシュ(param1、param、…paramn)を提供するため、適用して配列をインストールして交換することもできます。
var arr1 = new array( "1"、 "2"、 "3"); var arr2 = new Array( "4"、 "5"、 "6"); array.prototype.push.apply(arr1、arr2); console.log(arr1); // ["1"、 "2"、 "3"、 "4"、 "5"、 "6"]]
また、この方法で理解することができ、 ARR1はプッシュメソッドを呼び出し、パラメーターは配列アセンブリをパラメーターリストのセットに適用することで置き換えられます。
たとえば、クラスアレイの最大値を見つけたい
(function(){var maxnum = math.max.apply(null、arguments); console.log(maxnum); // 56})(34,2,56);ジャッジタイプ
console.log(object.prototype.tostring.call(123))// [object number] console.log(object.prototype.tostring.call( '123'))// [object string] console.log(object.prototype.tostring.call(undefined)// [object未定義] console.log(object.prototype.tostring.call(true))// [object boolean] console.log(object.prototype.tostring.call({}))// [object object] console.log(object.prototype.tostring.call([])) array] console.log(object.prototype.tostring.call(function(){}))// [object function]上記は、Apply and Callの使用の要約の完全な内容です。ディスカッションに参加するためにメッセージを残すことを歓迎します。また、この記事がJavaScriptを学習するすべての人に役立つことを願っています。