2013-07-10 53 views
0

如果沒有將它綁定到窗口對象,那麼實現這樣的事情的正確方法是什麼?將變量注入到結尾

x = function(fn) 
{ 
    foo = 'bar'; 
    fn(); 
} 

x(function() 
{ 
    console.log(foo) // error happens here 
}); 

在PHP中,您可以通過「use」指令進行操作。

$foo = 'bar'; 
$fn = function() use($foo) 
{ 
    echo $foo; // bar 
} 

編輯:我改變了一段代碼。我試圖實現的是,在閉包中創建一個聲明變量,而不需要在那裏傳遞它。

foo = 'bar'; 
console.log(foo) // bar 
console.log(window.foo) // bar 
console.log(this.foo) // bar 

我想達到同樣的效果,與另一個已被綁定爲「this」的對象。

+3

我沒有得到你想要的。我只希望答案不是「與」。 –

+0

你是不是把它與窗口對象綁定在一起意味着什麼?當你做一個封閉的時候,你會對封閉的範圍進行一種綁定。 –

+3

這不應該說'未定義'。在這裏工作正常http://jsbin.com/evacak/1/edit – elclanrs

回答

7

好吧,猜猜看,JavaScript有關閉。不是像PHP這樣的一半沒有的,你必須手動聲明你想要使用的閉包中的所有變量。

這個PHP代碼等效:

$foo = 'bar'; 
$fn = function() use($foo) 
{ 
    echo $foo; // bar 
} 

這是在JS:

var foo = 'bar'; 
var fn = function() { 
    console.log(foo); 
}; 

沒錯。你不是在PHP中調用你的函數,爲什麼我會在JS例子中調用它? :-)

順便說一句,如果你在你的JS控制檯中運行這段代碼:

var foo = 'bar'; 
var fn = function() { 
    console.log(foo); 
}; 
fn(); 

你會看到「巴」記錄。證明閉包工作,而不需要一些破解。 (use

關於全局變量:$foo變量是在PHP例如全球性的。他們也在JS例子中。如果你想有一個非全局變量,你需要一個本地環境。大多數時候,一個功能。

PHP例子有沒有全局變量:

function baz() { 
    $foo = 'bar'; 
    $fn = function() use ($foo) { 
     echo $foo; 
    }; 
} 

JS例如有沒有全局變量:

function baz() { 
    var foo = 'bar'; 
    var fn = function() { 
     console.log(foo); 
    }; 
} 

最後一個音符:如果你不使用var申報新在JS變量,它們是隱含的全局。在瀏覽器中,這意味着它們連接在window對象上。

如果你想如何聲明全局變量PHP/JS比較:

PHP代碼:

$foo; // global 
function bar() { 
    $_GLOBAL['baz']; // global 
    $bin; // local 
} 

JS代碼:

foo; // global 
function bar() { 
    window.baz; // global 
    var bin; // local 
    booze; // implied global 
} 
+0

+1這看起來像OP的混淆的第一個解釋... –

+0

你'使用相同的範圍,這就是爲什麼它在你的例子中工作。如果您通過其他函數幾次通過fn,則不再有效。但我的例子非常糟糕,所以沒關係。謝謝! –

+0

@maximkott也無法在PHP中工作。我不明白你的意思...... –

-1

如果我理解你的需要,你可以這樣做:

var closure_variables = new Object();; 
closure_variables.foo = 'bar'; 
window.bar = 'foo' 

(function(variables) 
{ 
    console.log(variables.foo) // undefined 
    console.log(bar) // foo 
})(closure_variables) 

或者你甚至可以直接傳遞參數foo的。

+2

您做出的錯誤與其他類似(相同?)的答案相同。 –

+0

哦,真的,謝謝花花公子 – Ricola3D

+0

我會提供一個重複的評論..這也需要'(函數(closure_variables)' – Orangepill

0

如果你要保持你的窗口對象乾淨,那麼這可能是你所需要的。

(function(){ 

    var foo = 'bar'; 

    (function(){ 
     console.log(foo) // bar 
    })(); 

})(); 

console.log(window.foo); //undefined 
0

答案是,在PHP中,你選擇什麼被封閉。在JS中,沒有辦法告訴閉包來選擇要包含哪些變量。所有詞彙可用的變量都包含在內。

但很難告訴你想要的東西,它看起來像要隱藏封閉的可變

唯一的解決方法是影着變量(由內部函數聲明他們)你不想

+0

這就是我以爲:( –

+0

我想知道OP是否希望'.call()'確定'this'的值在函數,(這不一定是一個閉包問題)? –

+0

等等,什麼?爲什麼你想遮蔽閉包的變量?這是我第一次聽到這樣的黑客('use')作爲一個特徵提到:-) –

0

在你的問題的後半部分你問有關調用 功能與this設置爲指定的對象。

調用功能fun設置thisobjectThatBecomesThis和參數也設定爲(ARG1,ARG2,...)使用:

fun.apply(objectThatBecomesThis, [arg1,arg2,...]) 

其中第二參數(可選)爲參數數組爲功能。

因爲第二個參數是一個數組,所以它使用[]方括號。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply