如果f是函数,f.x = 1代表什么?

时间:2017-11-22 12:06:17

标签: javascript

我在某个地方找到了这种类型的代码。 x和y代表什么?这些变量的范围是否仅限于函数f?

function f () {

};

f.x = 1;
f.y = 2;

4 个答案:

答案 0 :(得分:1)

javascript中的函数是第一类对象,可以视为任何其他对象。

var a  = {};
a.x = 1;
b.x = 2; // looks normal, right?

javascript中的对象是动态的,并且可以动态地将属性添加到它们中,因此,由于函数也只是对象,因此可以向它们添加属性。这些属性的范围与处理任何其他对象时的范围相同。这些属性不会影响函数内部范围(this上没有)

答案 1 :(得分:1)

  

这些变量的范围是否仅限于函数f?

这些是f函数对象的属性,它们的范围由f定义的范围定义,其中f的引用可以是使用即可。

<强>演示

function f1() {
  function f() {
  };

  f.x = 1;
  f.y = 2;
  return f;
}
var y = f1();

console.log(y.x)// prints 1 since scope of x property depends upon scope of y

但由于它们未在f的原型中定义,它们不能被继承

<强>演示

function f() {};

f.x = 1;
f.y = 2;
var y = new f();

console.log(y.x) // prints undefined

答案 2 :(得分:1)

在你的情况下(我改变了语法,但它是一样的)

var fn = () => { };

fn.x = 1;
fn.y = 2;

您要向fn对象追加2个属性。虽然它是function,如果你typeof fn,它会打印'function'它是一个扩展的Object,意味着它有属性。

您可以使用Object.getOwnPropertyNames()方法进行检查。

只需在fn.x = 1; fn.y = 2;

之前调用它
var fn = () => {};
console.log(Object.getOwnPropertyNames(fn)); // prints ["length", "name", "arguments", "caller", "prototype"]

fn.x = 1;
fn.y = 2;
console.log(Object.getOwnPropertyNames(fn)); // prints ["length", "name", "arguments", "caller", "prototype", "x", "y"]

答案 3 :(得分:0)

每个JavaScript函数实际上都是一个Function对象。

函数对象是从Function.prototype继承的对象。因此,函数基本上是可以调用的对象,因此您可以像任何其他对象一样附加到它们。

MDN参考:javadocs