首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有任何理由Object.freeze一个函数吗?

有任何理由Object.freeze一个函数吗?
EN

Stack Overflow用户
提问于 2016-08-03 22:53:09
回答 1查看 2.4K关注 0票数 7

我理解在深度对象上递归以对其每个子属性执行浅Object.freeze的意义。冻结函数对象的值有什么意义?引用已经被冻结了,因为在更高的层次上的浅冻结-它有可能变异函数对象的值本身吗?

示例:

代码语言:javascript
复制
// Library Function [deepFreeze source](https://github.com/substack/deep-freeze/blob/master/index.js)
function deepFreeze (o) {
  Object.freeze(o); // shallow freeze the top level
  Object.getOwnPropertyNames(o).forEach(function (prop) {
    if o[prop] != null // no point freezing null or undefined
    && (typeof o[prop] === "object" || typeof o[prop] === "function") {
      deepFreeze(o[prop]);
    }
  });
  return o;
};

// Usage
var x = {
  y: [1,2,3],
  z: function(){}
};
deepFreeze(x);

我只是想看看这里是否有一些我不理解的基本内容,或者这是否只是为了防止函数对象发生变异,例如:x.z.foo = 3

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-05 19:15:50

在Javascript中,函数是对象。我早就知道了。

函数对象的所有本机属性(prototype除外)都是不可变的:

代码语言:javascript
复制
var x = function(foo){}
Object.getOwnPropertyNames(x)
// ["length", "name", "arguments", "caller", "prototype"]
x.length; // 1, because there is one argument
x.length = 2;
x.length; // still 1.

当然,您可以添加其他属性:

代码语言:javascript
复制
x.foo = 3;
x.foo; // 3

但我认为使用函数作为数据结构是非常罕见的。

真正引起我共鸣的是贾里德的评论:

编写与其他对象不同的函数的代码是毫无意义的,但更没有意义。

人们可以向函数对象添加他们想要的任何属性,在某些情况下这可能是一个合理的解决方案,但我认为在那里存储值通常是出乎意料的。但是,编写库函数来处理函数与任何其他对象都没有任何区别。

结论:函数对象就像普通的对象一样锁定,因为为什么不呢?它还关闭了一个角落的情况,在那里有人可能会给它加一个值。

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

https://stackoverflow.com/questions/38754907

复制
相关文章

相似问题

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