JavaScript 作用域、闭包、上下文、this

作用域

某个变量或函数的可访问范围

全局作用域

在任何地方都能访问到

拥有全局作用域的对象:

  • 定义在最外层的变量
  • 全局对象的属性
  • 隐式定义的变量

局部作用域

通过函数定义,只在函数内部可见

闭包

定义在一个函数中的函数

function f1(){
    var n=999;
  nAdd=function(){n+=1}

  function f2(){//闭包
    alert(n);
  }
  return f2;
}

var result=f1();
result(); // 999
nAdd();
result(); // 1000

f1是f2的父函数,而f2被给了全局变量result,导致f2在内存中始终存在,而f2又依赖于f1,因此f1也在内存中始终存在,不会被垃圾回收机制回收

var a = b + c
;(function($){
    ...do something
})(jQuery)

// 第2行的“;”是为了避免引入时,与其他代码(第1行的c)造成错误
// jQuery 为传入的参数
// $ 为形参

执行上下文

就是JavaScript的执行环境

this

this是运行时确认的

this的指向:

  • 指向调用对象
  • 指向全局对象
  • 用new 构造就指向新对象
  • apply/call/bind, 箭头函数
var a = 1;
function fn() {
    console.log(window.a === this.a)
    console.log(this.a)
}

var obj = {
  fn: fn
}
obj.fn();// false undefined (指向调用对象)

fn();// true 1 (指向全局对象)
window.fn();// true 1

console.log(fn === window.fn) // true

 

var num = 4
function A(num) {
  this.num = num
  this.getNum = function() {
    console.log(this.num)
  }
}
a = new A(6)
a.getNum() // 6 用new 构造就指向新对象
var a = 3
function foo() {
  console.log( this.a );
}
var obj = {
  a: 2
};
foo.call(obj); // 2
foo.apply(obj);
foo.bind(obj)();

foo.call(null); // 3
foo.call(undefined); // 3
foo.call(); // 3

箭头函数

它没有自己的this

它使用封闭执行上下文(函数或是global)的 this 值

var x=11;
var obj={
 x:22,
 say: () => {
   console.log(this.x);
 }
}
​
obj.say(); // 11
obj.say.call({x:13}) // 11

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值