js 作用域和闭包1

原创 2017年08月12日 16:53:06

1.执行上下文

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

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

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

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

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

fn();    //没错
function fn()  {
    //声明
}

fn1();   // 有错
var fn1 = function()  {
    //表达式
}

3.this

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

//demo
var a = {
    name : 'A',
    fn : function() {
        console.log(this.name);
    }
}
a.fn()    //    this == a
a.fn.call({name: 'B'});    //    this == {name: 'B'}
var fn1 = a.fn
fn1()    //    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 apply
function fn1(name,age){
  alert(name)
  console.log(this)
}
fn1.call({x:100},'zhangsan',20)
//band
var 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.闭包

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

你不知道的JS读书笔记1—闭包&作用域

编译原理编译原理,实际上JavaScript是编译语言,只是它在执行前的短暂时间快速的编译。一般的编译步骤包括: 词法分析:简单地说就是划分单词 语法分析:将这些单词进行分析,转化为“抽象语法树”(A...

作用域与闭包

  • 2017年08月21日 21:07
  • 15KB
  • 下载

js的作用域链与闭包

函数的作用域链 依次为: 该函数的上文变量 .该函数自己的变量. (上至globel全局) 如图:alert的结果是window. 因为当调用person.say()后返回的是一个匿名函数 func...

js:深入闭包(作用域:上)

/**  * 闭包的作用域  */ fn1(); //fn1 能够执行,不会报错,对于通过function func_name()这种写法来定义的函数,永远都会被最先初始化。 function fn1...

JS作用域函数闭包

js作用域 //【变量提升】 console.log("h="+h...

《JS高程(3)》闭包/模仿块级作用域/私有变量-第7章笔记(05)

闭包

js 闭包以及就是变量作用域

要弄懂js闭包,需要先弄清楚js变量的作用域。针对下面几个例子说明一下: var name = "The Window";   var object = {     name : "My ...

JS 之 (三)作用域链、闭包、面向对象

作用域链定义变量在当前环境now、内部环境f1、内部深层环境f2/f3….都起作用的现象形成了一个链条,这个链条就称为变量的”作用域链” var title = '链条'; //...
  • znyyjk
  • znyyjk
  • 2016年09月12日 20:20
  • 190

js笔记---作用域(执行上下文[execution context],活动对象) 闭包

作用域:   首先,在javascript中的每个函数都是对象,是Funtion对象的一个实例,而Funtion中有一系列仅供javascript引擎存取的内部属性,其中一个便是[[scope]],...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:js 作用域和闭包1
举报原因:
原因补充:

(最多只允许输入30个字)