Js|构造函数

构造函数调用

如果函数或者方法调用之前带有关键字new,就构成函数调用。构造函数的语法允许省略实参列表和圆括号。
如下面两行代码等价:

1
2
var o=new Object();
var o=new Object;

构造函数调用创建一个新的空对象,这个对象继承自构造函数的prototype属性。 构造的函数会试图初始化新创建的对象。并将这个对象用作调用上下文因此可以使用this关键字来引用所创建的新对象。构造函数一般不使用return关键字。
例如:

1
2
3
4
5
6
7
8
9
10
11
this.name=name;
this.qq=qq;
this.showName=function ()
{
alert('my name is :'+this.name);
}
this.showQq=function()
{
alert('my qq is :'+this.qq);
};
}//只需在调用时在对象前加new

可变长的实参列表:实参对象

调用函数时传入的实参个数超过函数定义时的形参个数,没办法直接获得未命名值的引用,而参数对象解决了这个问题。
在函数体内,标识符arguments是指向实参对象的引用。

假设定义了函数f,实参只有一个x。如果调用这个函数时传入两个实参,第一个实参可以通过参数名x来获得,也可以通过arguments[0]来得到,第二个实参只能通过arguments[1]来得到,此外,与真正的数组一样,arguments也包含一个length属性,用以标识其所包含元素的个数。因此,如果调用函数f()时传入两个参数,arguments.length的值就是2.

arduments并不是真正的数组,是一个实参对象。

闭包:函数对象可以通过作用域链相互关联起来。

js采用词法作用域,也就是说,函数的执行依赖与变量作用域。为了实现这种,js内部状态不仅包含函数的代码逻辑,还必须引用当前的作用域链。一定角度来讲,所有的函数都是闭包:它们都是对象,都关联到作用域链。

1
2
3
4
5
6
7
var scope=“global scope”;
function checkscope(){
var scope=“local scope”;
function f(){return scope;}
return f();
}
checkscope(); //local scope

如果是checkscope()();则返回函数内嵌套的一个函数对象

文章目录
  1. 1. 构造函数调用
  2. 2. 可变长的实参列表:实参对象
  3. 3. 闭包:函数对象可以通过作用域链相互关联起来。
|