如何强制'函数'成为表达式,而不是声明?

时间:2015-07-24 17:33:28

标签: javascript webview

虽然这段代码很好:

function() { };

此代码不是:

x

顶部示例创建一个匿名函数并将其分配给var x = eval('function() { }'); 。底部示例是语句,其中需要函数名称,因此它是语法错误。

现在,定义一个匿名函数并没有将其分配到任何地方似乎毫无意义,但这是一个面对行为的例子:

function() { }

哪个应该像第一个示例一样,但是语法错误。

在我正在开发的应用程序的深处,我们来讨论这个问题。我希望WebView成为一个表达。

简短说明为什么这是一个将javascript调用到evaluateJavascript的原生OSX应用程序。我们有一个evaluateJavascript函数,本机层可以使用它来调用任意javascript。 try/catchmyCallback = evaluateJavascript("function() { }")包装给定代码以进行错误处理,因为这是获取详细错误信息的唯一方法。因此,如果您致电try { return eval('function() { }'); } catch(e) { // .... } ,我们会生成一个包含以下正文的函数:

Info.plist

并返回结果。

4 个答案:

答案 0 :(得分:2)

  1. 如果可能,请勿使用eval。查找错误的另一个选项是,如果您在window(或等效)对象上侦听错误,并将脚本导入为<script>,则会立即添加和删除。
  2. function之前在同一行上执行任何操作会导致function成为表达式
  3. 以下所有内容均有效(尽管无用)

    0, function () {};
    (function() {});
    +function () {};
    -function () {};
    !function () {};
    // etc
    

    这样的函数表达式通常是为 IIFEs 完成的,即

    (function (foo) {
        console.log(foo);
    }('bar'));
    // "bar" logged
    

    但您可以将样式应用于eval。括号或逗号运算符应该适合你

    var code = 'function () {}';
    var foo = eval('0, ' + code);
    foo; // function () {}
    

答案 1 :(得分:1)

你不能

class Type < ActiveRecord::Base belongs_to :supertype, class_name: "Type" has_many :subtypes, class_name: "Type", foreign_key: 'supertype_id' end

答案 2 :(得分:1)

尝试/接近 - 1:下面应该有效

var scope = {};
eval('scope.x = function() { return "Hello World"; }');
console.log(scope.x());

<强>输出

Hello World
[Finished in 0.3s]

** 方法 - 2 **

在阅读上述问题评论中IIFE的链接后,我尝试了以下内容 - 它似乎也有效。

var x = eval('(function() { return "Hello World"; })');
console.log(x());

但是,我意识到,对于IIFE,我们需要使用(function(){})()之类的代码 - 请注意尾随()。但是,在Approach-2代码中 - 我没有尾随()。然后,我查了eval documentation,然后我开始了解以下内容(这解释了为什么方法2有效):

  

作为字符串定义函数的eval需要“(”和“)”作为前缀和   后缀

答案 3 :(得分:1)

你说var x = eval('function() { }');应该像第一个例子一样。你为什么这么认为?您的eval参数

function() { }

是一个声明,如上所述,无效。你可以把它变成这样的表达式:

var x = eval('(function() { })');