美文网首页
ES5和ES6的this

ES5和ES6的this

作者: zhCN_超 | 来源:发表于2017-07-16 11:10 被阅读45次

2016/11/20
ES 5ES 6this指向还是有点区别,今天被问到箭头函数this指向,我略微懵逼,赶紧又看了下。

ECMAScript 5

ES 5this很明确,只有以下五种情况

全局

console.log(this); // this 等于 ECMAScript 在浏览器环境的 Global 对象,即 window

函数内

function foo(){
  console.log(this); // this 还是 window
}

方法调用

var obj = {
  name: 'alex',
  getName: function(){
    console.log(this.name);
  }
}
obj.getName(); // this 为 obj

/*
  想下面那样调用
  那么 this 就指向了 window
  因为这样调用时,函数的执行环境是全局的
 */
var bar = obj.getName;
bar();

构造函数

function Foo(){}
Foo.prototype.getName = function(){
  console.log(this.name);
}

var bar = new Foo();
bar.name = 'alex';
bar.getName(); // this 指向实例 bar

显示调用

applycall改变函数运行时的this指向

function foo(){
  console.log(this.name);
}

var applyObj = {
  name: 'alex'
}

var callObj = {
  name: 'f0rest'
}

foo.apply(applyObj); // alex
foo.call(callObj); // f0rest

ECMAScript 6

考虑到还没有浏览器能完全解析ES 6标准,所以需要借助诸如Babel等工具转成ES 5才可以在浏览器运行

语法

// ES 5
var foo = function(options){};

// ES 6
let foo = options => {};

ES 6中的规则是,紧随箭头的 { 被解析为块的开始,而不是对象的开始
所以小括号包裹对象字面量是唯一一个你需要牢记的小窍门

this

箭头函数它没有自己的this值,它继承至外围作用域
下面这个例子,thisundefined,因为ES 6是严格模式,严格模式thisundefined

let foo = options => {
  console.log(this);
};

React 中的实践

React组件中,注册事件有三种方式,目的是让事件函数内的this指向这个当前组件实例

// Method 1
constructor() {
  this.myEvent = this.myEvent.bind(this);
}
myEvent() {
  console.log(this);
}
render() {
  return (
    <div onClick={this.myEvent}>For test</div>
  );
}

// Method 2
myEvent() {
  console.log(this);
}
render() {
  return (
    <div onClick={this.myEvent.bind(this)}>For test</div>
  );
}

// Method 3
// 这里就是箭头函数,继承外围作用域的 this,即当前组件实例
myEvent = () => {
  console.log(this);
}
render() {
  return (
    <div onClick={this.myEvent}>For test</div>
  );
}

相关文章

  • React中ES6和ES5的不同之处

    组件类的定义 es5 es6 状态初始化 es5 }) es6 属性初始化 es5 es6 组件抛出 es5 es...

  • ES6 写法示例

    匿名函数调用 ES5 ES6 箭头函数 将数组的内容 * 2 ES5 ES6 默认参数 ES5 ES6 不定参数 ...

  • ReactNative之ES6与ES5区别

    解构复制 ES5 ES6 导入模块 ES5 ES6 导出模块 ES5 ES6 ES 6语法采用export来代替m...

  • JavaScript、ES5和ES6的介绍和区别

    距离ES6发布已有半年,对于ES6和ES5,你了解多少?这篇文章讲了JavaScript,ES5,ES6的一些介绍...

  • js es5 es6区别

    距离ES6发布已有半年,对于ES6和ES5,你了解多少?这篇文章讲了JavaScript,ES5,ES6的一些介绍...

  • ReactNative中ES5和ES6的区别

    ReactNative中ES5和ES6的区别 在ReactNative项目中有些用的es5,有些用的es6,有的是...

  • promise 和 async await

    写法不同 ES5 正常写法: ES6 Promise async await ES5 写法和 promise 写法...

  • ES6 类和ES5 构造函数

    ES5的构造函数和ES6的Class区别 ES5的构造函数的原型上的属性和方法可以遍历/ES6 不能够遍历 ES6...

  • ES5 和 ES6 继承比较:

    ES5构造函数和继承: ES6构造函数和继承:

  • es6重点介绍

    ES6 的变量声明 ES6 中新增了 let 和 const 来定义变量: var:ES5 和 ES6中,定义全局...

网友评论

      本文标题:ES5和ES6的this

      本文链接:https://www.haomeiwen.com/subject/juetkxtx.html