1、调用方式
直接调用:foo();
对象方法:o.method();
构造器:new Foo();
call/apply/bind:func.call(o);
2、创建函数
- 函数声明
1 | function add(a, b) { |
- 函数表达式
1 | // 函数变量 |
3、函数构造器
1 | var func = new Function("a", "b", "console.log(a + b);"); |
函数构造器一般很少使用,会出现一些很奇怪的现象
- localValue 仍为局部变量
1 | Function("var localVal='local'; console.log(localVal);")(); // local |
- local不可访问,全局变量global可以访问
1 | var globalVal = "global"; |
总结:
空白 | 函数声明 | 函数表达式 | 函数构造器 |
---|---|---|---|
前置 | √ | ||
允许匿名 | √ | √ | |
立即调用 | √ | √ | |
在定义该函数的作用域通过函数名访问 | √ | ||
没有函数名 | √ |
4、this
4.1 全局作用域下的this
1 | this.document === document; // true |
4.2 一般函数的this
1 | function f1() { |
4.3 作为对象方法的函数this
1 | // CASE 1 |
4.4 对象原型链上的this
1 | var o = {f: function(){ |
4.5 get/set方法与this
1 | function modules() { |
4.6 构造器中的this
1 | function MyClass() { |
4.7 call/apply方法与this
1 | function add(c, d) { |
4.8 bind方法与this
ES5才提供,IE9+才支持的函数
1 | function f() { |
4.9 函数属性 && arguments
- arguments
1 | function foo(x, y, z) { |
- apply/call
1 | function foo(x, y) { |
- bind
1 | this.x = 9; |
- bind与函数颗粒化
1 | function add(a, b, c) { |
解析: add.bind(undefined, 100)
先将100传参给add函数的第一个参数,即a;然后func(1, 2)
则会传参给函数的b跟c
- bind与new
1 | function foo() { |
解析: foo函数中返回值除非是对象,否则就将this作为返回值返回,this会被初始化为默认的一个空对象,并且this的原型是foo.prototype,该空对象的b属性会赋值为100,然后整个对象会被作为返回值返回并且忽略return的返回值。