问题标签 [function-constructor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
6938 浏览

javascript - Function 构造函数的合法使用

正如反复所说,使用Function 构造函数被认为是不好的做法(另见ECMAScript 语言规范,第 5版,第 15.3.2.1 节)

(其中所有参数都是包含参数名称的字符串,最后一个(或唯一一个)字符串包含函数体)。

总而言之,据说它很慢,正如Opera 团队所解释的那样:

每次 […] 对Function 表示源代码的字符串调用构造函数时,脚本引擎必须启动将源代码转换为可执行代码的机制。这通常对性能来说是昂贵的——例如,比简单的函数调用要贵一百倍。(马克“塔昆”威尔顿-琼斯)

根据 MDC 上的这篇文章虽然还不错(不过,我自己并没有使用当前版本的 Firefox 进行测试)。

克罗克福德补充

[t]语言的引用约定使得将函数体正确地表示为字符串变得非常困难。在字符串形式中,无法进行早期错误检查。[…] 而且它很浪费内存,因为每个函数都需要自己独立的实现。

另一个区别是

由 Function 构造函数定义的函数不继承除全局范围(所有函数都继承)之外的任何范围。(MDC

new Function除此之外,当您创建使用动态内容时,您必须注意避免注入恶意代码。

也就是说,TJ Crowder 在回答中说

[t] 这里几乎从来不需要类似的 [...] new Function(...),同样,除了一些高级的边缘情况。

所以,现在我想知道:这些“高级边缘案例”是什么?Function 构造函数有合法用途吗?

0 投票
1 回答
120 浏览

javascript - JS 面向对象。继承和 apply() 函数。为什么它不起作用?

我有这样的例子。

现在我希望以同样的方式从 Bar 访问 Foo 中的所有内容。我修改我的代码:

但是没有任何输出。我实际上发生了一些错误。当我隐藏Foo.apply(this, arguments);在评论下时,电话alert(fooObj.barVal);再次起作用。当我这样检查时:

它甚至会停止浏览器的工作(我使用 Chrome,所以出现了带有像素文件夹的整个黑屏)。在警报窗口中它写道RangeError: undefined

但是因为我在这个序列中有警报呼叫

第二个警报准确地显示了我正在等待的内容 - 它显示了BarValue

当我在 Bar 中复制它时,为什么 apply() 不起作用?是否有可能以某种方式在两个功能之间建立这种门?

0 投票
3 回答
1571 浏览

javascript - JavaScript 中的 void、eval 和 Function 构造函数有什么区别?

在这些不同的语句中执行代码的处理模型是什么?

0 投票
1 回答
130 浏览

javascript - 为什么 JS 中的一些函数有一个 prototype.constructor 属性而其他的没有?这些功能有什么区别?

JS 中的每个函数构造函数都有一个prototype.constructor属性。它存储了函数的定义:

this现在我检查一个简单的函数,而不是函数构造函数,它在体内没有任何内容:

现在我检查内置Array()函数:

现在我想检查一个内置对象的一些内置函数:

sort没有prototype。它在哪里?它的构造函数在哪里?

0 投票
1 回答
1075 浏览

javascript - 使用 CSP 在 Web Worker 中启用“新功能”

我无法new Function在 Web Worker 中工作。我有一个生成 Web Worker 的 HTML 页面。这个 Web Worker 通过new Function(str). 我正在尝试在打包的 Chrome 应用程序中使用它,该应用程序需要使用类似eval代码的页面在清单中明确列为沙盒页面。

现在,有两种选择:

  • 列出要沙盒化的页面如果这样做,我可以使用new Function,但我无法生成 Web Worker,因为我无法发出任何请求(沙盒页面具有唯一的来源)。new Worker(...)抛出一个SECURITY_ERR.
    • new Function在沙箱中工作
    • new Worker由于唯一来源而在沙箱中失败
  • 不要列出要沙盒化的页面。如果这样做,我可以生成一个 Web Worker,但该 Worker 不能使用new Function,因为它没有被沙盒化。new Function(...)抱怨EvalError使用它。
    • new Function由于类似而在非沙盒中eval失败
    • new Worker在非沙盒中工作

我的 CSP 如下:

我该怎么做才能new Function在 Web Worker 中工作?

0 投票
1 回答
5181 浏览

javascript - 如何获取调用函数/对象的上下文?

有没有办法获取调用函数的上下文(上面代码中的内联注释)?

如果我绑定到这个(将注释替换为this)并在F构造函数中声明它工作正常var def = define.bind(this);

0 投票
2 回答
227 浏览

javascript - JS函数构造函数每次都重新解析?

在 MDN 中,关于Functions 和 function scope ,每次评估时都解析是什么意思?这可以通过代码观察到吗?

在函数构造函数与函数声明与函数表达式部分中引用:

由函数表达式和函数声明定义的函数只解析一次,而由 Function 构造函数定义的函数则不解析。也就是说,传递给 Function 构造函数的函数体字符串必须在每次评估时进行解析。虽然函数表达式每次都会创建一个闭包,但函数体并没有重新解析,所以函数表达式仍然比“new Function(...)”快。因此,应尽可能避免使用 Function 构造函数。

然而,应该注意的是,嵌套在通过解析 Function 构造函数的字符串生成的函数中的函数表达式和函数声明不会被重复解析。例如:

var foo = (new Function("var bar = \'FOO!\';\nreturn(function() {\n\talert(bar);\n});"))();
foo(); //The segment "function() {\n\talert(bar);\n}" of the function body string is not re-parsed.

我已经编写了一个代码片段来(尝试)测试并理解它:

两者都警告“再次版本”。

是否重新解析是什么意思?

这可以通过代码结果来说明吗?

谢谢。


仅供参考,我尝试了另一个代码段:

两个警报“FOO!再次”,而不是“FOO!再次更多”。

0 投票
3 回答
3417 浏览

javascript - Javascript:向数组中的所有对象添加方法

想象一下下面的代码:

现在设想“数据”的价值是:

问题 1

现在,在我下载数据之后,假设我想为数组中的每个条目添加一个方法“colorStartsWithR”。我“认为”与其在数组的每个成员上定义它,不如在原型上以某种方式定义这个方法。但是,我不确定我能做到这一点,因为这些对象不是我创建的,而是由 $.get 返回的,所以我不清楚我是否在思考正确的方向。

问题2

更进一步,如果我想为数组的每个成员添加一个属性怎么办,特别是:

这样,我可以绑定(通过 knockoutjs)列表并包含一个复选框。在这种情况下,我怀疑原型是否会派上用场,因为每个成员都应该有自己的 ko.observable 属性。一个快速的直觉是做类似的事情:

这很好用,但是想象一下检索颜色列表的方法不止一种,或者用户可以创建新的颜色实例,并且我上面所做的自定义更加复杂。我现在需要复制上面的“附加”逻辑。有没有更聪明的方法?

我大部分时间都在使用强类型语言,有时这些事情对我来说并不那么明显。感谢您的任何建议...

-本

0 投票
2 回答
54 浏览

javascript - Javascript 对象实例属性意外设置

我有以下代码:

可以预见的输出是:

现在我尝试利用this查找原型链,并更改incTest为:

这给了我完全不同的输出!

不应该this.test引用 Foo 原型属性吗?这里到底发生了什么?

编辑:

此外,将行更改为Foo.prototype.test = this.test++;也会产生第二个输出,我不知道为什么。

编辑2:

第一次编辑的解决方案是后缀与前缀。前缀增量产生第一个输出。

0 投票
1 回答
64 浏览

javascript - 创建javascript构造函数时的语法错误

我正在尝试在 javascript 中创建如下构造函数。但我得到错误:

SyntaxError:意外的令牌非法

当我在 chrome 开发人员工具控制台中运行以下命令时,我得到了这个:

是否有任何语法错误。如果不是,那么是什么导致了错误。