2017-05-29 18 views
0

Javascriptの呼び出し()メソッド

var links = document.querySelectorAll('div'); 
for (var i = 0; i < links.length; i++) { 
    (function(){ 
     console.log(this); 
    }).call(links[i]); 
} 

が、なぜこの仕事ん:

var links = document.querySelectorAll('div'); 
for (var i = 0; i < links.length; i++) { 
    console.log.call(this, links[i]); 
} 

は、すべての呼び出しのコンテキストでウィンドウオブジェクトことになって、このではありません繰り返し?あなたはスニペット怒鳴るを実行する場合、それはあなたが正しいです

var links = document.querySelectorAll('div'); 
for (var i = 0; i < links.length; i++) { 
    console.log(links[i]); 
} 

を呼び出すと何ら変わりません

+0

、this'はconsole.log' 'にあるものは何でも'実際に私はあなたが間違っているかもしれないと思う重要でない –

+0

@JaromandaXです。私は 'console.log'が奇妙なことを覚えています。 –

+0

@BartekBanachewicz - 以前は 'this''が' console'オブジェクトでなければならなかったのですが、最近では –

答えて

0

、この範囲でthisキーワードがwindowオブジェクトにバインドされている、あなたは私が新しいプロパティを追加していることがわかりますSomeUniqueValuecall機能を使用している場合、ルックアップの範囲内でアクセス可能になるウィンドウオブジェクトに移動します。

ここで、そのブロックを関数内にラップすると、thisキーワードが呼び出しブロックのスコープに限定されていることがわかります。最後の例では、spanのみがコンソールに記録されます。明らかに

var links = document.querySelectorAll('div'); 
 
for (var i = 0; i < links.length; i++) { 
 
    console.log(links[i]); 
 
} 
 

 
window.SomeUniqueValue = "WAWAWIWA"; 
 
for (var i = 0; i < links.length; i++) { 
 
    console.log.call(this, SomeUniqueValue); 
 
} 
 

 
var someFunction = function() { 
 
    'use strict'; 
 
    var links = document.querySelectorAll('span'); 
 
    for (var i = 0; i < links.length; i++) { 
 
     console.log.call(this, links[i]); 
 
    } 
 
} 
 

 
someFunction();
<div>This</div> 
 
<div>Works</div> 
 
<div>Fine</div> 
 
<span>Inner Scope</span>

+0

ありがとう、今私は混乱している部分は、このように呼び出すことができない理由です: 'console.log.call(links [i]、this)' これをリンク[i]として設定することは可能です、またはいくつかの基本的なjavascriptの概念に関する知識が不足していますか? –

+0

関数は最初のパラメータがコンテキストを定義することを期待しているので、このように呼び出すことはできません。次のパラメータは、Console.Log関数に渡す引数です。 console.log(this)のように、l [i]のスコープにバインドされています。元の例のように、引数が1つしかない場合は、関数の動作が異なります。希望は意味をなさない! –

関連する問題