2014-03-19 64 views
-1

在JavaScript中創建一個函數:我需要一個特定的範圍內創建一個功能。 要創建的函數由以前的代碼生成過程動態生成。此功能的定義範圍也可能會發生變化。JavaScript的:一個特定的範圍

看看這個例子:

var createFnInOtherScope = function() { 
    console.debug('createFnInOtherScope: Who I am', this); 

    //This code can not be modified because it's dynamically generated 
    function MyFunction() { 
      console.debug('MyFunction'); 
    } 
} 
var obInitial = { 
    createFn: function() { 
     console.debug('createFn: Who I am', this); 
     createFnInOtherScope.call(window); 
    } 
} 
obInitial.createFn(); 

//ReferenceError: MyFunction is not defined 
window.MyFunction(); 

我怎麼能做到這一點?

謝謝。

+0

我認爲你是要求增加一個功能到全球範圍。以下答案的一些評論解決了這個問題如果你正在尋找一種更靈活的方法,你應該看看MONADs(允許/禁止的權限)。 –

+0

請定義「範圍」是什麼_you_,因爲它看起來不是通常的JS定義(它是_lexical scope_)。 – Alnitak

回答

3

如果我理解正確的話,你要問是不可能的。

Javascript中的範圍是詞法結構,這意味着範圍內的內容由源文件中相對於任何封閉函數的物理位置(在解析時間)定義。

不能追溯添加的東西到一個範圍一旦範圍已經(詞彙)被關閉。

+1

是的,但_any_變量定義的_default_(隱式)範圍是'window'對嗎?所以只要你說'myFunction = function ...'而不是'function myFunction ...',它應該(看起來像)工作。 –

+0

@DanFarrell不是「範圍」,這就是全局變量如何變成'window'的屬性。用'var'定義的變量不會成爲任何東西的屬性。 – Alnitak

+0

好的,好點。該函數是_in_作用域,但_its_作用域未被更改。 –

0

功能範圍在分析時定義。你可以創建一個函數,並使其作爲window屬性visible:

function outer() { 
    function inner() { 
    console.log("hello world"); 
    } 

    window.inner = inner; 
} 

window.inner(); // hello world 

但是,這並不改變「內部」功能的範圍。這是可見通過全局對象調用,但功能是堅定不移地在「外」功能的範圍。

0

this情況下只要定義這個功能:

var createFnInOtherScope = function() { 
    this.MyFunction = function() { 
     console.debug('MyFunction'); 
    }; 
}; 

DEMO:http://jsfiddle.net/Ur6vF/

+1

'this'不是_scope_,這是一個_context_。 – Alnitak

+0

@Alnitak我正要將'this'改爲* object *。我認爲它更好地描述了這個案例,但可能不太正確。所以很可能你是對的,*上下文*是最好的詞。 – VisioN

相關問題