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闭包、原型、继承、作用域)(2016)

考察js中比较核心的几个知识点,闭包、原型链、继承、作用域
  • u014306354
  • u014306354
  • 2016年09月30日 11:12
  • 2376

javascript之块级作用域的概念和闭包

简单的块级作用域: javascript没有块级作用域的概念 function test(){ for(var i = 1 ; i ...
  • bq1073100909
  • bq1073100909
  • 2015年09月24日 08:44
  • 1384

javascript理解之变量作用域与闭包

何为闭包闭包是指能够访问自由变量的函数 (变量在本地使用,但在闭包中定义)。换句话说,定义在闭包中的函数可以“记忆”它被创建时候的环境。函数作用域与声明提前var scope= "global sco...
  • sinat_25127047
  • sinat_25127047
  • 2016年06月12日 17:33
  • 1349

[JavaScript] 你不知道的 JS (作用域 &amp; 闭包) (英文版)

  • 2014年11月27日 09:07
  • 5.06MB
  • 下载

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

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

作用域与闭包

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

js(三)---函数的作用域与闭包

函数作用域 函数是js比较重要的概念,函数里面是一个执行体,只有当你去调用这个函数是,这个执行提才会产生作用。当你不去调用它时,它就是一个封闭的空间。 函数是声明有三种: 匿名函数(函数表达式):...
  • Shine_twinkle
  • Shine_twinkle
  • 2017年12月22日 15:32
  • 32

JS的作用域、闭包原理以及性能问题

作用域: 下面我们先搞明白这样几个概念: 函数对象的[[scope]]属性、ScopeChain(作用域链) Execution Context(运行期上下文)、Activation...
  • guorun18
  • guorun18
  • 2015年11月13日 16:48
  • 197

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

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

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

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

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