首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新函数(){}与新函数();

新函数(){}与新函数();
EN

Stack Overflow用户
提问于 2016-10-17 22:32:45
回答 3查看 23K关注 0票数 20

我学到了一些代码,我只是想了解一下new Function();。在查看jslint时,new Function();被突出显示为出乎意料。我开始用它做以下实验。

代码语言:javascript
复制
var func = new Function();
func.property = "some property";
return func;

一个替代者。

代码语言:javascript
复制
var func = new function(){
this.property = "some property";
}
return func;

工作和第二个工作都被js忽略了。

我在这里做了什么壮观的事情吗,还是完全一样?像这样使用new Function();是正确的吗?

原始代码摘录附后。

代码语言:javascript
复制
 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;


   });
 })

这两种语言在语法上有错吗?

在获得了一些很好的建议之后,编辑了,我将代码修改为以下内容:

代码语言:javascript
复制
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"
});
代码语言:javascript
复制
<div id="myElement">Say Hi</div>

它工作得很好,看起来也干净多了。JS Lint对我很好,我可以处理下一个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-17 22:41:27

在第一种情况下,创建一个新对象并应用Function构造函数。

返回值是一个函数

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

返回值是一个对象

票数 20
EN

Stack Overflow用户

发布于 2016-10-17 22:56:02

这两种说法确实不同。我将集中在第二次发言中指出不同之处。

代码语言:javascript
复制
var newObj1 = new function () {
    this.prop1 = "test1";
    this.prop2 = "test2"
};

相当于以下内容:

代码语言:javascript
复制
var Example = function () {
    this.prop1 = "test1";
    this.prop2 = "test2"
};

var newObj2 = new Example();

唯一的区别是,在第一个示例中,调用的构造函数是一个匿名函数。注意,当使用javascript中的new关键字调用函数时,它会显示特殊行为

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

如前所述,第一条语句返回一个函数,而第二条语句返回一个对象。两者都是错误的,但是一个返回函数,另一个返回对象可能会在代码的其他部分产生影响。

票数 10
EN

Stack Overflow用户

发布于 2016-10-17 22:40:17

是的,创建对象是不正确的,因为通过新函数()创建的对象比使用函数表达式创建的函数效率要低。

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

欲获得更多参考,对象/功能

希望这能有所帮助

检查以下代码片段

代码语言:javascript
复制
var func = new Function();
func.property = "some property";
"some property"
console.log(func);

现在,当您签入控制台时,它说它是匿名的,但是当一个对象通过函数表达式创建时。

代码语言:javascript
复制
var func=new function(){this.x=10;}
console.log(func);

这将返回一个对象--我猜您理解其中的区别。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40096704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档