您的位置:首页 > Web前端 > JavaScript

js函数2-函数调用

2016-03-26 22:35 507 查看
    JS的函数调用有4种方式:方法调用,函数调用,构造函数调用,call/apply间接调用。不同的调用模式,函数内使用的this关键字也会指向不同的对象上。

   A,方法调用模式:myObject.foo();

    ----this指向调用者对象上

B,函数调用模式:foo();

   ----this指的全局对象,严格模式下this指向的是undefined

C,构造器调用模式

      ----使用new来调用构造器,将创建一个连接到该函数的prototype成员的新对象,同时this会被绑定到这个新对象上

D,Apply/call 调用

           ----this会作为第一个参数传入,如果传入null/undefined,方法中的this会指向全局对象,而在严格模式下,this就指向null/undefined。

1,上面第二条,可以用来判断当前是否是严格模式:

var strict = (function(){return !this})();
2,方法调用链:

当方法并不需要返回值时,最好直接返回this,这样调用完后可继续调用其它方法,形成方法链。

3,构造函数调用时,创建一个新的对象,这个对象继承自构造函数的prototype属性,构造函数试图初始化这个新创建的对象,并将这个对象用做其调用上下文。尽管构造函数看起来像一个方法调用,它依然会使用这个新对象作为调用上下文。如表达式new o.m()中,this并不是o,而是创建的新对象。

4,如果构造函数有显式的return语句返回一个对象,那调用表达式的值就是这个对象。如果构造函数使用return语句但没指定返回值,或者返回一个原始值,那么将忽略返回值,还是使用新对象作为调用结果。

5,没有形参的构造函数调用都可以省略圆括号,比如下面代码是等价的。

var o=new Object();  var o = new Object;
6,函数形参与实参:

     构造函数对传入的参数类型和个数都不会做检查,少的自动补充undefined,多的自动忽略。函数中arguments并不是真正的数组,它是一个实参对象。每个实参对象包含以数字为索引的一组元素以及length属性,但它不是真正的数组,是类数组。通过arguments访问的实参对象和通过传入的实参对象是同一个引用。

function f(x){
console.log(x);  //输出实参值
arguments[0] = null;
console.log(x); //输出为null
}

严格模式中函数无法使用arguments作为形参名或局部变量名,也不能给arguments赋值。

arguments不定义了callee和caller属性,callee属性指代当前正在执行的函数。caller属性可以访问调用栈。callee常用在匿名函数的递归调用自身。这两属性在严格模式下使用会报错。

7,好的编程习惯不使用多个离散值作为形参,而是使用对象,函数内使用键值对取值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  js 函数