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,上面第二条,可以用来判断当前是否是严格模式:
当方法并不需要返回值时,最好直接返回this,这样调用完后可继续调用其它方法,形成方法链。
3,构造函数调用时,创建一个新的对象,这个对象继承自构造函数的prototype属性,构造函数试图初始化这个新创建的对象,并将这个对象用做其调用上下文。尽管构造函数看起来像一个方法调用,它依然会使用这个新对象作为调用上下文。如表达式new o.m()中,this并不是o,而是创建的新对象。
4,如果构造函数有显式的return语句返回一个对象,那调用表达式的值就是这个对象。如果构造函数使用return语句但没指定返回值,或者返回一个原始值,那么将忽略返回值,还是使用新对象作为调用结果。
5,没有形参的构造函数调用都可以省略圆括号,比如下面代码是等价的。
构造函数对传入的参数类型和个数都不会做检查,少的自动补充undefined,多的自动忽略。函数中arguments并不是真正的数组,它是一个实参对象。每个实参对象包含以数字为索引的一组元素以及length属性,但它不是真正的数组,是类数组。通过arguments访问的实参对象和通过传入的实参对象是同一个引用。
严格模式中函数无法使用arguments作为形参名或局部变量名,也不能给arguments赋值。
arguments不定义了callee和caller属性,callee属性指代当前正在执行的函数。caller属性可以访问调用栈。callee常用在匿名函数的递归调用自身。这两属性在严格模式下使用会报错。
7,好的编程习惯不使用多个离散值作为形参,而是使用对象,函数内使用键值对取值。
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,好的编程习惯不使用多个离散值作为形参,而是使用对象,函数内使用键值对取值。
相关文章推荐
- Extjs4.0 最新最全视频教程
- Javascript中toFixed方法的改进
- 5个常见可用性错误和解决方案
- js数组实现图片轮播
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- js可突破windows弹退效果代码
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- JSP脚本漏洞面面观
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- 使用BAT一句话命令实现快速合并JS、CSS
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例