函数参数是不可变的

时间:2015-09-28 02:26:01

标签: javascript

对于每个函数,都有一个arguments属性。 当我想设置它时,它不会取值。 我很好奇,内部实现的arguments属性如何允许这种行为,我无法修改它?我想要实现的是实现一个无法在我的对象中修改的属性,有人可以告诉我如何实现它。

  var a=function b(){

      };
      a.arguments="hello";
      console.log(a.arguments); //still null

1 个答案:

答案 0 :(得分:1)

您想查看Object.freeze()Object.seal()

mozilla.org的例子

obj1 = {
  internal: {}
};

Object.freeze(obj1);
obj1.internal.a = 'aValue';

obj1.internal.a // 'aValue'

// To make obj fully immutable, freeze each object in obj.
// To do so, we use this function.
function deepFreeze(obj) {

  // Retrieve the property names defined on obj
  var propNames = Object.getOwnPropertyNames(obj);

  // Freeze properties before freezing self
  propNames.forEach(function(name) {
    var prop = obj[name];

    // Freeze prop if it is an object
    if (typeof prop == 'object' && !Object.isFrozen(prop))
      deepFreeze(prop);
  });

  // Freeze self
  return Object.freeze(obj);
}

obj2 = {
  internal: {}
};

deepFreeze(obj2);
obj2.internal.a = 'anotherValue';
obj2.internal.a; // undefined

arguments可以在函数内部修改,就像任何其他变量一样,因此它不像您想象的那样受到保护。在函数之外设置变量不会像参数那样在函数之外访问。我知道你想要的是什么,所以Object.freeze()Object.seal()可能会让你感兴趣。

*

此问题并非专门针对函数范围中的arguments。如果您已经达到此页面,请参阅下面的

*

保留arguments参数,为您提供传递给函数本身的参数。

考虑以下代码::

设置函数以将参数记录到控制台:

function test() {
  console.log(arguments);
}

使用参数调用测试:

test('test');

<强>返回:

test

arguments现在是测试函数原型的一部分,除非通过使用参数调用函数来设置它们,否则无法更改。

更清楚。您无法在Javascript中为参数添加默认值。我想这可能是你想要完成的事情。