在运行时用JavaScript设置函数的名称
Set the name of a function at runtime in JavaScript
是否可以在运行时用JavaScript设置函数的名称?
var ctor = function() {}; // Anonymous function because I don't know the name ahead of runtime.
ctor.name = 'foo'; // Pseudocode - this is effectively what I want to do
我希望以上等同于:
var ctor = function foo() {};
编辑
下面是一个示例用例:
function mix(fn1, fn2, name) {
var ctor = function() {};
ctor.name = name; // Vain attempt to set the name of the function.
ctor.prototype = Object.create(fn1.prototype);
Object.keys(fn2.prototype).map(function(k) {
ctor.prototype[k] = fn2.prototype[k];
});
// Return a constructor function with the prototype configured.
return ctor;
}
function Foo() {}
Foo.prototype.foo = function(){};
function Bar(){}
Bar.prototype.bar = function() {};
var Foobar = mix(Foo, Bar, 'Foobar');
console.log(new Foobar()); // ctor {bar: function, foo: function} (in Chrome) - I wanted Foobar { bar: function, foo: function }
name
是一个非标准的,只有一些浏览器支持。
现在,它已经在ECMAScript6:中进行了标准化
19.2.4.2名称
name
属性的值是一个字符串,用于描述作用该名称没有语义意义,但通常是用于引用函数的变量或属性名ECMAScript代码中的定义点。此属性具有属性{[[Writable]]:false,[[Enumerable]]:false,[[可配置]]:true}。没有上下文名称的匿名函数对象根据本规范与它们相关联的
name
没有自己的属性,但继承%FunctionPrototype%的name
属性。
因此,您的代码将在不支持name
的浏览器上工作,但新属性将是可写和可枚举的。在支持它的浏览器上,您的代码将无法工作,因为name
是不可写的。
因此,更好的等效代码是
Object.defineProperty(ctor, 'name', {
value: 'foo',
configurable: true
});
免责声明:这可能会让一些喜欢代码安全和可预测的人感到不安
当然,你不会真的这么做,因为你很明智,对吧
function rename(fn, name) {
var fnStr = fn.toString().replace(/function/, 'function ' + name);
eval.call(window, fnStr);
return window[name];
}
var tmp = function(a, b) { return a + b; };
rename(tmp, 'add');
add(3, 4); // 7
当然,根据你需要的良好表现(如果你使用eval,那就不太好了),你可以(但你不会) 在实际代码中这样做,人们会讨厌你,,但没关系,因为你不会。 函数的定义范围存在一些问题(可能还有一些边缘断裂的情况)。Eval使用this的上下文来决定在哪个范围内操作,因此传递窗口对象意味着重命名的函数将始终在窗口对象内定义。 这是一个相当做作的例子,但它应该让你对陷阱有一些了解。Function.prototype.rename = function(name) {
return rename(this, name);
};
function init() {
function go() {
return 'go';
};
var ctor = function() {
return 'ctor';
};
rename(ctor, 'go');
go(); // 'go'
next();
}
function next() {
go(); // 'ctor'
}
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 使用JAVASCRIPT转换货币.可以't通过我的函数设置转换后的输入文本字段的值
- 将OnClick函数设置为<ul>,最后一个ul是擦除第一个ul-s
- 为什么我需要为扩展函数设置构造函数
- 使用命名函数设置多个事件响应
- 如何通过回调函数设置值
- 为模式设置的值在通过 AJAX 成功函数设置时不显示
- 如何停止一个函数并将其他函数设置为在 html5 的 javascript 中加载时运行
- 如何为JavaScript函数设置变量以嵌入视频
- 使用jquery每个函数设置最大计数
- angularjs如何为函数设置观察程序
- Javascript:为作为参数传递的函数设置参数
- 函数设置为允许的范围是什么
- 在 javascript 中从函数设置对象的值,而无需调用该函数
- 如何使用 javascript 函数设置 href 参数值
- 函数/设置间隔意外记录两次到控制台
- 我在输入字段上触发绑定时将函数设置为未定义
- CKEDITOR函数+设置
- 如何将点击函数设置为多个元素
- 在 Backbone 中将函数设置为属性.js给了我一个错误,但如果我在初始化方法中设置它,它会起作用