a.fn.call({name:
'
cyy2
'
});
//
this==={name:'cyy2'}
var
fn1
=
a.fn;
fn1();
//
this===window
</
script
>
this:
作为构造函数执行
作为对象属性执行
作为普通函数执行
call apply bind
<script>
//构造函数
function Foo(name){
this.name=name;
var f=new Foo('cyy');
//作为一个对象的属性
var obj={
name:'cyy',
fn(){
console.log(this.name);
obj.fn();
//普通函数的this
function fn(){
console.log(this);
fn();//this===window
//call apply bind
function fn1(name,age){
console.log(name);
console.log(this);
fn1.call({x:10},'cyy2',18);
fn1.apply({x:20},['cyy3',19]);
var fn2=function(name,age){
console.log(name);
console.log(this);
}.bind({x:30});
fn2('cyy4',20);
</script>
var
a
=
document.createElement(
'
a
'
);
a.innerHTML
=
i;
a.addEventListener(
'
click
'
,
function
(e){
e.preventDefault();
alert(i);
//
i是自由变量,要去父作用域寻找值;for循环不是作用域,所以获取到的i是循环结束的全局变量i=10
document.body.appendChild(a);
//
正确写法,自执行的匿名函数形成函数作用域
var
i;
for
(i
=
0
;i
<
10
;i
++
){
(
function
(i){
//
形成函数作用域,i不再是全局变量
var
a
=
document.createElement(
'
a
'
);
a.innerHTML
=
i;
a.addEventListener(
'
click
'
,
function
(e){
e.preventDefault();
alert(i);
//
i是自由变量,要去父作用域寻找值
document.body.appendChild(a);
})(i);
</
script
>
<script>
//闭包的应用
function isFirstLoad(){
var _list=[];//通常_开头的变量表示私有
return function(id){
if(_list.indexOf(id) >= 0){//不是第一次出现
return false;
}else{
_list.push(id);
return true;
var firstload=isFirstLoad();
console.log(firstload(10));//true
console.log(firstload(10));//false
console.log(firstload(20));//true
</script>