Javascript 新函数(){}vs新函数();

Javascript 新函数(){}vs新函数();,javascript,Javascript,我学习了一些代码,刚刚开始理解新函数()。通过jslint检查新函数()被突出显示为意外。我开始用它做以下实验 var func = new Function(); func.property = "some property"; return func; 替代品 var func = new function(){ this.property = "some property"; } return func; js lint忽略了这两项工作和第二项工作 我在这里做了什么了不起的事,还是完全

我学习了一些代码,刚刚开始理解
新函数()。通过jslint检查
新函数()被突出显示为意外。我开始用它做以下实验

var func = new Function();
func.property = "some property";
return func;
替代品

var func = new function(){
this.property = "some property";
}
return func;
js lint忽略了这两项工作和第二项工作

我在这里做了什么了不起的事,还是完全一样?使用
newfunction()的语法正确吗
附上原始代码摘录

var$=(函数(){
功能文件(道具、val){
var isSet=布尔值(val),
action=CSSStyleDeclaration.prototype.setProperty,
args=参数;
如果(isSet){
每个功能(节点,i){
action.apply(node.style,args);
});
归还这个;
}else if(typeof(prop)==“object”){
每个功能(节点,i){
Object.keys(prop.forEach)(函数(属性){
node.style[property]=prop[property];
});
});
归还这个;
}否则{
返回此。节点[0]。样式[prop];
}
}
//方法链
返回(函数(选择器、上下文){
var q=新函数();
q、 选择器=选择器;
q、 上下文=上下文| |文档;
q、 nodeList=q.context.querySelectorAll(选择器);
q、 每个=功能(动作){
[]forEach.call(q.nodeList,函数(项,i){
行动(项目一);
});
归还这个;
};
q、 单击=功能(操作){
[]forEach.call(q.nodeList,函数(项,i){
item.addEventListener(“单击”,操作,错误);
});
归还这个;
};
q、 toString=函数(){
返回q选择器;
};
q、 css=函数(prop,val){
返回文件调用(此、道具、val);
};
返回q;
});

})
是的,创建对象不是正确的方法
因为通过new Function()创建的对象的效率低于使用函数表达式创建的函数

但是,全局函数对象没有自己的方法或属性,因为它本身就是一个函数,所以它通过原型链从Function.prototype继承了一些方法和属性

更多参考

希望这有帮助

检查以下代码段

var func=new Function();
func.property=“某些属性”;
“一些财产”

控制台日志(func)在第一种情况下,创建一个新对象并应用
函数
构造函数

返回值是一个函数

在第二个示例中,您创建了一个新对象,并将匿名函数应用为构造函数

返回值是一个对象


两种说法确实不同。我将集中讨论第二项声明,指出其中的区别

var newObj1 = new function () {
    this.prop1 = "test1";
    this.prop2 = "test2"
};
相当于以下内容:

var Example = function () {
    this.prop1 = "test1";
    this.prop2 = "test2"
};

var newObj2 = new Example();
唯一的区别是,在第一个示例中,调用的构造函数是匿名函数。请注意,当在javascript中使用
new
关键字调用函数时,它会显示

在第一条语句中,调用的构造函数是一个已定义的函数


正如已经指出的,第一条语句返回函数,而第二条语句返回对象。两者都不正确,但一个返回函数,另一个返回对象可能会影响代码的其他部分。

为什么在代码中使用
函数
而不是对象
{}
?当然,这在语法上是正确的,否则加载文件时会出现语法错误。JSLint标记它是因为Crockford认为您不应该创建这样的函数。还有,我是@zerkms的;他们都没有做任何你不能用
var q={}做的事情。他们做了一些不同的事情<代码>类型化(新函数)==“函数”
类型化(新函数(){})==“对象”
。永远不要!这两种语法都有很多错误。你到底想做什么?你需要什么样的结果?
func
应该是函数吗?如果是,它在被呼叫时应该做什么?是的,您确实需要对原始代码进行修改(至少是从您的摘录中)。我认为这根本不能回答“通过new Function()创建的对象比使用Function expression创建的函数效率低”的问题---这需要一些科学证据。@zerkms无论如何,我认为这与问题无关?“它们效率较低,因为通过函数创建的对象将返回匿名函数,而通过表达式返回对象”---这没有意义,很抱歉,它的效率较低,因为构造函数将字符串作为函数体,并且该字符串必须解析为代码,进行某种计算……但不是像计算
{}
新对象所得到的普通对象。当然,因为它的
构造函数
将指向在
new
操作符之后传递的匿名函数,并且它的原型链将包含两个原型,但是除了使用
{}
新对象
创建的对象之外,它不会包含任何其他方法。谢谢。现在我开始通过注释获取构造函数。我确实理解构造函数,但从未真正将它与
函数
放在上下文中。第二个函数也是“匿名的”。)@罗布,这是真的。。。我想我的意思是立即调用匿名函数,而不是以后分配和重用。这似乎也应该在不同的上下文中使用,即获取字符串。我发布的源代码在这一点上不是错了吗?在您的代码上下文中,使用,就像您在编辑中所做的那样,是更好的方法。
Function
允许您使用字符串(参数字符串)组合函数