相关疑难解决方法(0)

JavaScript中的(1,eval)('this')vs eval('this')?

我开始阅读JavaScript模式,一些代码让我困惑.

var global = (function () {
    return this || (1, eval)('this');
}());
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

Q1:

(1, eval) === eval

为什么以及如何运作?

Q2:为什么不呢

var global = (function () {
    return this || eval('this');
}());
Run Code Online (Sandbox Code Playgroud)

要么

 var global = (function () {
    return this;
}());
Run Code Online (Sandbox Code Playgroud)

javascript eval

80
推荐指数
4
解决办法
2万
查看次数

jQuery .globalEval()函数

我偶然发现了.globalEval()浏览jQuery源代码的功能.有一些我不明白的简短文档.显然,它"对于动态加载外部脚本很重要".为什么?来源也有点模糊:

globalEval: function( data ) {
    if ( data && rnotwhite.test( data ) ) {
        // We use execScript on Internet Explorer
        // We use an anonymous function so that context is window
        // rather than jQuery in Firefox
        ( window.execScript || function( data ) {
            window[ "eval" ].call( window, data );
        } )( data );
    }
},
Run Code Online (Sandbox Code Playgroud)

人们真的在现实生活中使用它吗?如果是这样,为了什么?

jquery

14
推荐指数
1
解决办法
1万
查看次数

解析javascript函数中的外部作用域引用以进行序列化

var foo = (function(){
  var x = "bar";
  return function(){
    console.log(x);
  };
})();

console.log(foo.toString()); // function() {console.log(x);}
(foo)(); // 'bar'
eval('(' + foo.toString()+')()')); // error: x is undefined
Run Code Online (Sandbox Code Playgroud)

是否有解析(修改)函数的技术,因此外部作用域的引用成为本地引用,如:

function() {console.log(x);}
Run Code Online (Sandbox Code Playgroud)

变为:

function() {console.log("bar");}
Run Code Online (Sandbox Code Playgroud)

现在,该函数可以通过网络进行字符串化和传输,并在另一个运行时中执行.

也许有人可以将函数解析为抽象语法树然后修改它?引用将永远超出范围(不可用),对吧?

目标:

我正在将过滤器函数从节点运行时序列化到postgresql plv8运行时.现在过滤器函数有接口:dbClient.filter((row,age)=> row.age> age),ageFromOuterScope).then(matches => ...)

我想要接口dbClient.filter((row)=> row.age> age)).then(matches => ...),其中age是外部作用域的引用.

更新:

我只能想象一个解决方案.分析函数,检测函数外部变量的引用,然后重写原始函数:

function(row) {
   return row.age > age
}
Run Code Online (Sandbox Code Playgroud)

至:

function(row, age) {
  return row.age > age
}
Run Code Online (Sandbox Code Playgroud)

检测到的变量也应该添加到表示数组的字符串中,例如:

var arrayString = '[age]'
Run Code Online (Sandbox Code Playgroud)

然后评估字符串:

var functionArgs = eval(arrayString)
Run Code Online (Sandbox Code Playgroud)

最后:

dbClient.filter(modifiedFunction, ...functionArgs).then(matches => …
Run Code Online (Sandbox Code Playgroud)

javascript serialization function abstract-syntax-tree dereference

9
推荐指数
1
解决办法
214
查看次数

将javascript注入javascript函数

我有一个奇怪的问题,我需要将一些javascript注入另一个javascript函数.我正在使用一个锁定的框架,所以我无法更改现有的功能.

我得到的是这样的

function doSomething(){...}

...***

我可以操纵***(上面)但是我不能改变doSomething函数...相反,我需要以某种方式在doSomething代码的末尾注入几行代码.

我需要这样做的原因是自定义框架调用doSomething(),这导致从我需要提取的服务器返回一个ID.这个ID只在doSomething函数中引用,所以我无法捕获它,除非我向该函数注入代码(除非我遗漏了一些东西).

有没有办法做到这一点?

javascript function code-injection

8
推荐指数
3
解决办法
2万
查看次数

为什么[eval]在[eval] [0]('code')中工作?

我看到这种方式执行代码:

[eval][0]('alert("hello")')  
Run Code Online (Sandbox Code Playgroud)

我想知道方括号包围的未引用的'eval'是什么意思,以及为什么这样做.(例如,window['eval'][0]('alert("hello")')将导致TypeError).有没有描述这种语法的教程?

javascript

1
推荐指数
1
解决办法
120
查看次数

在javascript应用程序中将输入的文本作为javascript运行?

我的目标是编写一个javascript应用程序,它将文本作为输入,并将该文本编译/运行为代码.

例如,假设JS应用程序有一个可以变成红色或绿色的灯.用户输入的文本可以是将lightRed();其变为红色,并将lightGreen();其变为绿色.我认为解决这类问题的标准方法是实现某种词法分析器/解析器,就像Jison所做的那样.

但是,我对JS编程很新,这似乎是一项艰巨的任务 - 特别是当我后来计划为if/else语句添加更复杂的功能时.所以我想知道是否可以将输入的文本视为javascript,主要是使用浏览器处理javascript的能力.所以javascript应用程序将有一个灯,它将具有名为lightRed()和lightGreen()的函数.输入到javascript的文本将被视为javascript,因此将lightRed()作为文本写入将直接执行应用程序中的lightRed()函数.这可能吗?这会比使用像Jison这样的东西更复杂吗?谢谢!

javascript

0
推荐指数
1
解决办法
82
查看次数