js 作用域和闭包1

来源:互联网 发布:淘宝买iphone6p 编辑:程序博客网 时间:2024/05/20 23:40

1.执行上下文

范围:一段<script>或者一个函数

一段<script>会产生一个全局执行上下文:变量定义、函数声明;

一个函数会产生一个函数执行上下文:变量定义、函数声明、this、arguments;

//democonsole.log(a);  //  undefinedvar a = 100;fn('zhangsan');  //  'zhangsan'  20function fn(name) {  age =20;  console.log(name, age);  var age;}                //  不推荐这么写

2.函数声明和函数表达式

fn();    //没错function fn()  {    //声明}fn1();   // 有错var fn1 = function()  {    //表达式}

3.this

this要在执行时才能确认,定义时无法确认;

//demovar a = {    name : 'A',    fn : function() {        console.log(this.name);    }}a.fn()    //    this == aa.fn.call({name: 'B'});    //    this == {name: 'B'}var fn1 = a.fnfn1()    //    this == window

4.this使用的几种情况

  • 作为构造函数执行
  • 作为对象属性执行
  • 作为普通函数执行
  • call    apply    bind

//构造函数function Foo(name){  this = {}  this.name = name  return this}var f = new Foo('zhangsan')//作为对象属性var obj = {  name : 'A',  printName : function(){    console.log(this.name)  }}obj.printName()//作为普通函数执行function fn(){  console.log(this)//Window}fn()//call applyfunction fn1(name,age){  alert(name)  console.log(this)}fn1.call({x:100},'zhangsan',20)//bandvar fn2 = function(name,age){  alert(name)  console.log(this)}.bind({y:200})fn2('zhangsan',20)

5.作用域

  • 没有块级作用域
  • 只有函数和全局作用域

//无块级作用域if(true){    var name = 'zhangsan';}console.log(name);//函数和全局作用域var a = 100;function fn() {    var a = 200;    console.log('fn',a);}console.log('global', a);fn();

6.作用域链

var a = 100;function fn() {    var b = 200;    //    当前作用域没有定义的变量,即自由变量,去它的父级作用域去寻找,这个父级作用域是定义时的,不是执行时的    console.log(a);    console.log(b);}fn();

7.闭包

//demofunction F1() {    var a =100;    //返回一个函数    return function () {        console.log(a);    }}//    f1得到一个函数var f1 = F1();var a = 200;f1()  //  100

闭包使用的场景:函数作为返回值;函数作为参数传递

原创粉丝点击