我开始阅读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) 我偶然发现了.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)
人们真的在现实生活中使用它吗?如果是这样,为了什么?
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
我有一个奇怪的问题,我需要将一些javascript注入另一个javascript函数.我正在使用一个锁定的框架,所以我无法更改现有的功能.
我得到的是这样的
function doSomething(){...}...***
我可以操纵***(上面)但是我不能改变doSomething函数...相反,我需要以某种方式在doSomething代码的末尾注入几行代码.
我需要这样做的原因是自定义框架调用doSomething(),这导致从我需要提取的服务器返回一个ID.这个ID只在doSomething函数中引用,所以我无法捕获它,除非我向该函数注入代码(除非我遗漏了一些东西).
有没有办法做到这一点?
我看到这种方式执行代码:
[eval][0]('alert("hello")')
Run Code Online (Sandbox Code Playgroud)
我想知道方括号包围的未引用的'eval'是什么意思,以及为什么这样做.(例如,window['eval'][0]('alert("hello")')将导致TypeError).有没有描述这种语法的教程?
我的目标是编写一个javascript应用程序,它将文本作为输入,并将该文本编译/运行为代码.
例如,假设JS应用程序有一个可以变成红色或绿色的灯.用户输入的文本可以是将lightRed();其变为红色,并将lightGreen();其变为绿色.我认为解决这类问题的标准方法是实现某种词法分析器/解析器,就像Jison所做的那样.
但是,我对JS编程很新,这似乎是一项艰巨的任务 - 特别是当我后来计划为if/else语句添加更复杂的功能时.所以我想知道是否可以将输入的文本视为javascript,主要是使用浏览器处理javascript的能力.所以javascript应用程序将有一个灯,它将具有名为lightRed()和lightGreen()的函数.输入到javascript的文本将被视为javascript,因此将lightRed()作为文本写入将直接执行应用程序中的lightRed()函数.这可能吗?这会比使用像Jison这样的东西更复杂吗?谢谢!