Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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 Function.prototype.toString()并不总是返回有效的JS。为什么?_Javascript_Ecmascript 6_Eval - Fatal编程技术网

Javascript Function.prototype.toString()并不总是返回有效的JS。为什么?

Javascript Function.prototype.toString()并不总是返回有效的JS。为什么?,javascript,ecmascript-6,eval,Javascript,Ecmascript 6,Eval,考虑以下类声明: class A {} A.prototype.test1 = function test1() { console.log("test1") } 评估test1的字符串化版本会生成有效的JS,如下所示: const a = new A eval(`(${a.test1})`)() // outputs "test1" 但是,如果我们以不同但基本相同的方式构建我们的类: class B { test2() { console.log("test2") } } 评估t

考虑以下类声明:

class A {}
A.prototype.test1 = function test1() { console.log("test1") }
评估
test1
的字符串化版本会生成有效的JS,如下所示:

const a = new A
eval(`(${a.test1})`)() // outputs "test1"
但是,如果我们以不同但基本相同的方式构建我们的类:

class B {
    test2() { console.log("test2") }
}
评估
test2的字符串化版本失败:

const b = new B
eval(`(${b.test2})`)() // SyntaxError: Unexpected token {
(它被字符串化为
test2(){console.log(“test2”)}
,除非嵌入到类声明中,否则它是无效的JS)

我可以理解字符串化本机函数是不可计算的,例如
“”。indexOf.toString()
将返回一个包含
[本机代码]
的字符串,我接受这一点

但是,难道没有办法保证对用户定义的函数(即源代码可用的函数)调用的
Function.prototype.toString()
生成有效的、可计算的JS吗

但是,难道没有办法保证对用户定义的函数(即源代码可用的函数)调用的
Function.prototype.toString()
生成有效的、可计算的JS吗

否。这取决于功能的类型:

toString
表示要求:

  • 字符串表示必须具有FunctionDeclaration、FunctionExpression、GeneratorDeclaration、GeneratorExpression、AsyncFunctionDeclaration、AsyncFunctionExpression、ClassDeclaration、ClassExpression、ArrowFunction、AsyncArrowFunction或MethodDefinition的语法,具体取决于对象的实际特征
  • 表示字符串中空格、行终止符和分号的使用和放置取决于实现
  • 如果对象是使用ECMAScript代码定义的,且返回的字符串表示形式不是MethodDefinition或GeneratorMethod,则表示形式必须确保,如果在与用于创建原始对象的词法上下文等效的词法上下文中使用
    eval
    对字符串进行求值,它将产生一个新的功能等效对象。在这种情况下,返回的源代码不得随意提及原始函数源代码未随意提及的任何变量,即使这些“额外”名称最初在范围内
  • 如果实现无法生成满足这些条件的源代码字符串,那么它必须返回一个字符串,
    eval
    将抛出
    SyntaxError
    异常

因为您有一个MethodDefinition,所以您得到了一个方法的表示。如果您的函数既不是MethodDefinition,也不是GeneratorMethod,那么您很可能会得到一个可以
eval
评估的表示(第三点),但即使如此,规范说实现应该返回一个抛出语法错误的表示,所以
”\_(ツ)_/“

“除非嵌入到类声明中”-是的,确实如此。目前是这样,但基于此:,建议在(近期?)将来更改