作用域和闭包-执行上下文:
变量提升(写代码时千万不要先使用再定义)
<script> console.log(a);//undefined var a=10; fn('cyy,18); function fn(name,age){ age20; console.log(name,age);cyy 20 age; } </>
fn( fn(name){ console.log(this); console.log(arguments); console.log(name); } >
作用域和闭包-this:
this要在执行时才能确认值,定义时无法确认
> { name:.name); } } a.fn();this===a a.fn.call({name:cyy2});this==={name:'cyy2'} fn1a.fn; fn1();this===window >
this:
作为构造函数执行
作为对象属性执行
作为普通函数执行
call apply bind
构造函数 Foo(name){ .namename; } fnew Foo(); 作为一个对象的属性 obj.name); } } obj.fn(); 普通函数的this fn(){ console.log(); } fn();this===window call apply bind fn1(name,age){ console.log(name); console.log(); } fn1.call({x:},1)">); fn1.apply({x:cyy319]); (name,1)">); }.bind({x:30}); fn2(cyy4); >
作用域和闭包-作用域:
没有块级作用域,只有函数和全局作用域
无块级作用域 if(true){ name; } console.log(name); 有全局和函数作用域 ; fn(){ ; console.log(fn:+a); } fn(); console.log(global:a); >
作用域链 b; 当前函数作用域内没有定义的变量,即自由变量 console.log(a); console.log(b); } fn(); >
作用域和闭包--闭包:
闭包的使用场景:
1、函数作为返回值
2、函数作为参数传递
函数作为返回值 F1(){ 100return (){ console.log(a);a是自由变量,向父级作用域去寻找---函数定义时的作用域 } } f1F1(); 200; f1();100 函数作为参数传递 F2(){ (){ console.log(b);b是自由变量,向父级作用域去寻找---函数定义时的作用域 f2F2(); F3(fn){ 300; fn(); } F3(f2);100 >
作用域和闭包--解题:
错误的写法 点击结果都是10 i; for(i0;i<++document.createElement(a); a.innerHTMLi; a.addEventListener(click(e){ e.preventDefault(); alert(i);i是自由变量,要去父作用域寻找值;for循环不是作用域,所以获取到的i是循环结束的全局变量i=10 }) document.body.appendChild(a); } 正确写法,自执行的匿名函数形成函数作用域 ){ ((i){ 形成函数作用域,i不再是全局变量 ); a.innerHTMLi; a.addEventListener((e){ e.preventDefault(); alert(i);i是自由变量,要去父作用域寻找值 }) document.body.appendChild(a); })(i); } 闭包的应用 isFirstLoad(){ _list[];通常_开头的变量表示私有 (id){ (_list.indexOf(id) >= ){不是第一次出现 false; }else{ _list.push(id); ; } } } firstloadisFirstLoad(); console.log(firstload());true console.log(firstload(false true >
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。