2015-01-13 4 views
0

Я пытаюсь выполнить функцию в другой области, чем там, где она определена. Мне нужно получить переменные, доступные в области выполнения, доступной для контекста функций.Достижение динамического охвата в JavaScript

Образец кода может быть как

var k = function() { alert(x); }; 

(function() { 

    var x = 100; 
    k(); 

})(); 

Ее невозможно для функции к х, чтобы получить доступ, который находится в объеме, где она выполняется.

Возможные работы обходные, что у меня есть следующие:

  1. инъекционные х в качестве параметра для работы
  2. использование Eval как

    var k = "function() { alert(x); }"; 
    
    (function() { 
    
        var x = 100; 
        var m = eval("("+k+")");//prints 100 
        m(); 
    
    })(); 
    //But this same work around wont work if I use k = "alert(x);" and 
    //define m = new Function(k); 
    
  3. связывают х как this контекст для функции и сделать alert(this).

Если я исключаю вышеуказанные 3 варианта, есть ли другие способы решения этой проблемы? Есть ли способ, которым я могу вставлять переменные в область функций во время выполнения, точно так же, как call, apply и bind делает для this?

+1

Нет, если вы хотите, чтобы переменные были доступны в функции, вы передаете их в качестве аргументов. – adeneo

+1

Можете ли вы объяснить, в чем проблема, которую вы действительно пытаетесь решить, поскольку принятие «x» в качестве аргумента является очевидным решением здесь? – jfriend00

+0

@ jfriend00: Я пытаюсь написать библиотеку, где пользователь сможет писать функции для определения потока. Внутри функций он может использовать некоторые частные функции, поддерживаемые библиотекой. Может быть, как 'stop()', 'rework()' и т. Д. Передача их в качестве аргументов кажется хорошим в этой точке. – mithunsatheesh

ответ

1

Я вижу, что в вашей функции это нормально, чтобы объявить переменную и не вызвать k напрямую.

this подходит вам?

var o = 
{ 
    x : 50, 
    k : function() { alert(this.x); } 
} 

o.k(); 

(function() { 

    this.x = 100; 
    var f = o.k; 
    f(); 
    o.k(); 

})(); 
+0

славная попытка.Но на самом деле это третий вариант, о котором я упоминал внутренне. – mithunsatheesh

+0

Но что, если я прибегу к опции eval, я упоминаю в вопросе, просто чтобы избежать использования 'this' и просто использовать легко читаемые функции? Просто любопытно узнать, что вы думаете об этом. И это действительно было целью этого вопроса :) – mithunsatheesh

Смежные вопросы