Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用eval()的奇怪关闭行为--为什么?_Javascript_Closures_Eval - Fatal编程技术网

Javascript 使用eval()的奇怪关闭行为--为什么?

Javascript 使用eval()的奇怪关闭行为--为什么?,javascript,closures,eval,Javascript,Closures,Eval,首先,请不要警告我eval()。我明白了。假设我只是好奇 接下来,在下面的代码中,eval(…)创建一个闭包并捕获参数“arg1” 其输出为“闭包打印arg1:hek”。伟大的正如所料 然而。。。如果我将eval赋值给一个变量并执行相同的操作,则闭包不会捕获“arg1” 此代码段的输出是未定义arg1。如果我测试以确保eval和fn_uu相等,它们是 请注意,如果我在test()的主体中放入this.arg2,则eval和fn_uu都会在闭包中捕获arg2。所以这种奇怪的现象只适用于你要结束的函

首先,请不要警告我eval()。我明白了。假设我只是好奇

接下来,在下面的代码中,eval(…)创建一个闭包并捕获参数“arg1”

其输出为“闭包打印arg1:hek”。伟大的正如所料

然而。。。如果我将eval赋值给一个变量并执行相同的操作,则闭包不会捕获“arg1”

此代码段的输出是未定义arg1。如果我测试以确保eval和fn_uu相等,它们是

请注意,如果我在test()的主体中放入this.arg2,则eval和fn_uu都会在闭包中捕获arg2。所以这种奇怪的现象只适用于你要结束的函数的参数

  • 为什么会发生这种情况
  • 如何让它工作?也就是说,如何将eval函数分配给变量并使用该变量捕获参数

  • eval
    由编译器专门识别。这就是允许它引入和访问局部变量绑定的原因。但是编译器只能在使用它的正常名称时才能识别它。当它看到对
    fn\uu
    的调用时,它无法判断此变量是否等同于
    eval
    ,因此它将其编译为正常的函数调用

    有关这方面的详细信息,请参阅

    var fnStr = "(function() { console.log('closure print arg1: '+arg1);})();";
    function test(arg1) {
    
        eval(fnStr);
    }
    
    test('hek');
    
    var fn_ = eval;
    var fnStr = "(function() { console.log('closure print arg1: '+arg1);})();";
    function test(arg1) {
    
        fn_(fnStr);
    }
    test('hek');