0

是否有可能以任何方式做这样的事情:

function A() {
    var Loaded = 'loaded';
    raise Loaded;
}
function A_raise(evt) {
    console.log(evt);
}
A.prototype.constructor = A;
A.prototype.raise = A_raise;

关键部分是这条线:

raise Loaded;
4

2 回答 2

4

在 JavaScript 中获得无括号函数调用的唯一方法是定义一个 setter/getter 属性,或覆盖其中一种特殊方法:toStringvalueOf。在这两种情况下,您都无法很好地控制传递给调用的参数。

function C() {}
C.prototype.valueOf = function () { alert("valueOf called"); };
var c = new C();
// No parentheses
+c;

您可以调用不带括号的构造函数,但同样不能传递参数。

function f() { alert("f"); }
// No parentheses
new f

你不能的一个原因是分号插入。

f()

是一个函数调用,原样

f
()

if
(x) { }

是一个有效的条件,因为if它是语言的核心部分,但如果你可以从函数调用中删除括号,那么分号插入将不得不像这样对待代码

var x = raise

y

作为初始化为调用函数的结果的变量。


由于您询问了语言扩展,EcmaScript 规范的第 16 章说允许解释器添加到语言的语法中,

实现可以扩展程序语法和正则表达式模式或标志语法。为了允许这一点,所有允许抛出 SyntaxError 的操作(例如调用 eval、使用正则表达式文字或使用 Function 或 RegExp 构造函数)都被允许展示实现定义的行为,而不是在遇到实现时抛出 SyntaxError -程序语法或正则表达式模式或标志语法的定义扩展。

所以自从

 raise foo

不是语言中的有效表达式或语句,他们可以允许,但他们不能以改变含义的方式这样做

 raise
 foo

必须具有相同的含义

 raise;
 foo

所以口译员将不得不做出raise一个新的受限制的生产,这是由于措辞而有问题的:

以下是语法中唯一受限制的产生式:

这可能意味着不规范,但并非明确如此。

于 2013-02-27T17:59:51.193 回答
1

你不能在 JavaScript 中定义新的语句,所以你实际上不能创建你在A.

编辑:从您对问题的评论中,很明显您正在寻找定义一个新的语句/关键字。不,你不能那样做。


原始答案

您的目标是在A构造函数中调用A_raise函数吗?如果是这样,你真的很接近。只是改变:

raise Loaded;

this.raise(Loaded);

实例| 资源

在通过new关键字对构造函数的调用中,this是新构造的对象,它已经从构造函数的prototype属性中接收了它的原型。So thiswill have raiseon it (通过它的原型),raise并将参考A_raise函数。

但同样,您需要括号(和this.)。

于 2013-02-27T18:02:47.547 回答