闭包、this、ES6特性
声明一个函数 function fun1
函数内定义一个变量比如 var x=1
如果这时候在function内声明一个函数 fun2
fun2中对这个函数外面的x进行操作
这时候把fun2的地址付给函数外面的一个变量A
形成一个函数表达式,
因为JS中的作用域是从内层向外层找变量的值
每次运行A 即A()的时候都需要找之前那个x 这时候函数fun1就叫作一个闭包(closure) ,这个x会一直留在内存中不会被回收 即 —(closure:fun1)
fun2 fun1 全局 ---> 作用域链
| (包起来了) |
| |
----------------------------
|
|
形成了一个闭包
因为全局和fun2的作用域连结起来了
讲一下this:
1.this是在一个函数被调用时确定的。(注意函数这两个大字)
2.函数被调用的时候 如果函数被某一个对象所拥有, 那么this指向这个对象。
3.如果函数独立调用,this指向undefined,在非严格模式下指向window
4.当this为某个(属性:值)键值对中的值的内容时,先找那个函数,再找那个函数的对象,要是没有函数就是window
关于第四点:
var obj = { a:this };
console.log(obj.a); <-没有函数,最后找到window
// demo
var a = 20;
var obj = {
a: 10,
c: this.a + 20, <--这里的this是window
fn: function () {
return this.a; <--函数fn属于obj对象,这里的this是obj
}
}
console.log(obj.c);
console.log(obj.fn());
// demo2
'use strict';
var a = 20;
function foo () {
var a = 1;
var obj = {
a: 10,
c: this.a + 20, <--这里this,先看他在 函数 foo里面,然后foo并不属于任何对象 所以是undefined
fn: function () {
return this.a;
}
}
return obj.c;
}
console.log(foo()); // ?
console.log(window.foo()); // ? <-- window对象中的foo
写一个粘合函数:
function glue(){
var a = Array.prototype.slice.call(arguments); //call中的this指向了arguments
console.log(a.join(''));
}
glue('把',123,'我','粘合','起来吧');
讲一下箭头函数:
function a(){
var x = 20;
return function(){
this.x;
}
}
a();
这样return的是10。(this是在函数被调用时确定的,return的这个function不属于任何对象,所以这个function中的this是undefined,在非严格下是window)
如果是用 return ()=> this.x this是他外面的this
原因:箭头函数中没有this,如果在箭头函数中使用this,则这个this一定是他外层的this 即爸爸function的this!!