我学到了一些代码,我只是想了解一下new Function();。在查看jslint时,new Function();被突出显示为出乎意料。我开始用它做以下实验。
var func = new Function();
func.property = "some property";
return func;一个替代者。
var func = new function(){
this.property = "some property";
}
return func;工作和第二个工作都被js忽略了。
我在这里做了什么壮观的事情吗,还是完全一样?像这样使用new Function();是正确的吗?
原始代码摘录附后。
var $ = (function() {
function doCSS(prop, val) {
var isSet = Boolean(val),
action = CSSStyleDeclaration.prototype.setProperty,
args = arguments;
if (isSet) {
this.each(function(node, i) {
action.apply(node.style, args);
});
return this;
} else if (typeof(prop) === 'object') {
this.each(function(node, i) {
Object.keys(prop).forEach(function(property) {
node.style[property] = prop[property];
});
});
return this;
} else {
return this.nodes[0].style[prop];
}
}
// chaining of methods
return (function(selector, context) {
var q = new Function();
q.selector = selector;
q.context = context || document;
q.nodeList = q.context.querySelectorAll(selector);
q.each = function(action) {
[].forEach.call(q.nodeList, function(item, i) {
action(item, i);
});
return this;
};
q.click = function(action) {
[].forEach.call(q.nodeList, function(item, i) {
item.addEventListener("click", action, false);
});
return this;
};
q.toString = function() {
return q.selector;
};
q.css = function(prop, val) {
return doCSS.call(this, prop, val);
};
return q;
});
})
这两种语言在语法上有错吗?
在获得了一些很好的建议之后,编辑了,我将代码修改为以下内容:
var $ = (function($) {
function doCSS(prop, val) {
var isSet = Boolean(val),
action = CSSStyleDeclaration.prototype.setProperty,
args = arguments;
if (isSet) {
this.each(function(node, i) {
action.apply(node.style, args);
});
return this;
} else if (typeof(prop) === 'object') {
this.each(function(node, i) {
Object.keys(prop).forEach(function(property) {
node.style[property] = prop[property];
});
});
return this;
} else {
return this.nodes[0].style[prop];
}
}
// chaining of methods
return (function(selector, context) {
var element = context || document;
var q = {
selector: selector,
nodeList: element.querySelectorAll(selector),
each: function(action) {
[].forEach.call(this.nodeList, function(item, i) {
action(item, i);
});
return this;
},
click: function(action) {
[].forEach.call(this.nodeList, function(item, i) {
item.addEventListener("click", action, false);
});
return this;
},
toString: function() {
return selector;
},
css: function(prop, val) {
return doCSS.call(this, prop, val);
},
}
return q;
});
})($);
$("#myElement").css({
background: "blue",
color: "#fff"
});<div id="myElement">Say Hi</div>
它工作得很好,看起来也干净多了。JS Lint对我很好,我可以处理下一个问题。
发布于 2016-10-17 22:41:27
在第一种情况下,创建一个新对象并应用Function构造函数。
返回值是一个函数。
在第二个示例中,您创建了一个新对象,并将匿名函数应用于构造函数。
返回值是一个对象。
发布于 2016-10-17 22:56:02
这两种说法确实不同。我将集中在第二次发言中指出不同之处。
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关键字调用函数时,它会显示特殊行为。
在第一个语句中,调用的构造函数是一个已经定义的函数,函数。
如前所述,第一条语句返回一个函数,而第二条语句返回一个对象。两者都是错误的,但是一个返回函数,另一个返回对象可能会在代码的其他部分产生影响。
发布于 2016-10-17 22:40:17
是的,创建对象是不正确的,因为通过新函数()创建的对象比使用函数表达式创建的函数效率要低。
全局函数对象没有自己的方法或属性,但是,由于它本身就是一个函数,所以它通过Function.prototype的原型链继承了一些方法和属性。
欲获得更多参考,对象/功能
希望这能有所帮助
检查以下代码片段
var func = new Function();
func.property = "some property";
"some property"
console.log(func);
现在,当您签入控制台时,它说它是匿名的,但是当一个对象通过函数表达式创建时。
var func=new function(){this.x=10;}
console.log(func);这将返回一个对象--我猜您理解其中的区别。
https://stackoverflow.com/questions/40096704
复制相似问题