1. 函数正常调用javascript
2. 做为对象方法(把这个函数写进对象属性中充当一个方法来用)java
3. 经过new做为构造函数使用数组
4. 间接调用:call()、apply()和bind();浏览器
5. 自调用(function(){})();或者(function(){}());app
1. 函数正常调用通常是为了快速写一个功能模块并保护做用域的时候经常使用。函数
2. 对象方法:毋庸置疑是一个封装的面相对象的思惟this
3. new做为构造函数是建立一个对象的方法之一spa
4. 自调用通常用于快速执行或者插件初始化。prototype
5.至于call()、apply()和bind()呢?带着这个疑问咱们去探讨一下:插件
1). 使用call和apply的第一个参数必须是一个对象
2). call第二个参数以后是一些列参数而apply必须是把这些参数组成一个数组传入。 3). bind方法只传入一个对象,把这个函数绑定在这个对象上!并返回一个新的函数!调用新的函数并传入参数,这个过程当作这个对象的这个方法来操做,而实参所有传入原函数。
var name = "张三"; var obj = {name:"李四"}; function myFunction(arg1,arg2) { console.log("\n"+this.name); console.log("\n"+arg1); console.log("\n"+arg2); } myFunction("我是参数1","我是参数2"); //张三 myFunction.call(window,"我是参数1","我也是参数"); //张三 //1 call方法 myFunction.call(obj,"我也是参数1","我也是参数2"); //李四 //apply方法 myFunction.apply(obj,["我也是参数1","我也是参数2"]); //李四 //bind方法 var bindNewFun = myFunction.bind(obj); bindNewFun("我是bind参数1","我是bind参数2"); //李四
首先函数内部的this指向调用当前函数的对象,正常的函数调用f(x);===window.f(x);因此f(x)里的this指的是window。通常使用call、apply和bind函数传入一个新的对象,改变函数内部的this指向(从全局window转到传入的对象!),经过call、apply和bind传入的对象,在函数内部被this指向,就能访问这个对象了。否则直接调用函数的话,this会指向全局对象window。
1. 首选咱们知道每一个函数其实也是一个对象,既然是对象,那它就应该会有本身的属性和方法。就比如如每一个函数建立时JavaScript都会给它自动建立一个属性property和方法toString()同样!固然也就还有咱们的call()、apply()和bind()方法啦...
2. 实际来源:每一个函数的原型是Function.prototype。因此这些方法是从函数原型来的!
Function.prototype.call()
Function.prototype.apply()
Function.prototype.bind()
console.log(Function.prototype.hasOwnProperty('bind')) //true console.log(Function.prototype.hasOwnProperty('call')) //true console.log(Function.prototype.hasOwnProperty('apply')) //true
0. context是函数中this的指向
1. 每一个js函数都有与之对应的上下文,由于每当调用一个函数时,一个新的执行上下文就会被建立出来。而且将其压入到执行上下文堆栈的顶部。浏览器老是执行当前在堆栈顶部的上下文,一旦执行完毕,该上下文就会从堆栈顶部被弹出,而后,进入其下的上下文执行代码。
2. 能够经过call和apply和bind三个函数改变函数的上下文。
3. context代表当前函数被谁调用!
4. 上下文一般是取决于一个函数如何被调用
A. 当函数做为对象的方法被调用时,this 被设置为调用方法的对象
B. 当调用一个函数时经过new的操做符建立一个对象的实例。当以这种方式调用时,this 的值将被设置为新建立的实例
C. 当调用一个未绑定函数,this 将被默认设置为 全局上下文(global context) 或window对象(若是在浏览器中)