js函数2-函数调用

Posted _oldzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js函数2-函数调用相关的知识,希望对你有一定的参考价值。

    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函数2-函数调用的主要内容,如果未能解决你的问题,请参考以下文章

JS调用函数时啥时候加小括号()?啥时候不加小括号()?

js构造函数中this介绍

js构造函数中this介绍

JS调用函数时候加括号与只写函数名字的区别 fn与fn()的区别

js函数引用函数调用与回调函数

js中调用函数时加不加括号的问题