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>