美文网首页
es6 箭头函数

es6 箭头函数

作者: zenggo | 来源:发表于2016-11-17 16:55 被阅读274次
  • 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
    请看下面这个例子:
var a = {
    x: 'haha',
    f: () => {
        console.log(this.x);
    }
};
var b = {
    x: 'heiehi'
};
a.f(); // undefined
a.f.call(b); // undefined

输出undefined是因为箭头函数定义时所在对象为global对象,没有x属性(是在global对象的环境下定义的,即定义时this指向global,而不是a对象,这里容易混淆)。该函数在定义时,this就被绑定了定义时的所在对象。
再看一个例子:

function get() {
    return {
        f: () => {
            console.log(this.x);
        }       
    }
};
var b = {
    x: 'heiehi'
};
get.call(b).f(); // heihei
// 或
var b = {
    x: 'heiehi',
        get: function () {
            return {
                f: () => {
                    console.log(this.x);
                }       
            }
        }
};
b.get().f(); // heihei

这里get函数运行时的this指向b,f定义时this绑定了b。
PS: 在node中,运行一个js程序:

//test.js
function a() {
    console.log(this === global ? 'global' : this);
}
console.log(this); // {}
console.log(this === global); // false
a(); // global
a.call({x:1}); // {x:1}

可见与浏览器环境不同,全局环境下代码执行时的this指向一个空对象,全局环境下调用函数,会将global对象传给this。而在浏览器环境中(globalwindow对象),全局环境下的this即指向window

  • 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。
    请看下面例子:
function a() {
    return () => {
        console.log(arguments);
    }
}
a(1,2,3)(5,6); // {'0':1,'1':2,'2':3}

箭头函数内访问arguments时,访问的是外层代码块的arguments
再看一个例子:

//test.js
var a = 0;
// arguments = {};
setTimeout(() => {
    console.log(a);
    if (++a<10) {
        setTimeout(arguments.callee, 500);
    }
}, 500); // 1,1,1,1,1.................无限

在node环境中,上述代码里的arguments.callee指向node运行test.js文件时,用来包裹代码的函数。因此以上所有代码就会不断重复执行
在浏览器环境中,会报出arguments undefined的错误。因为浏览器运行js代码不像node会包个函数在外面,所以箭头函数中的代码运行时,直接找外层代码块中的arguments,不在函数中所以就找不到了。
这时如果把arguments = {}这句去注释,则不会报错。看来箭头函数运行时查找arguments也和查找普通变量一样。

总结:

thisarguments在箭头函数内的调用过程:箭头函数运行时,引擎不定义这俩变量,这样就会沿着作用域链向上查找,找到了箭头函数定义时的thisarguments变量(这句话可能不严谨,还不了解js引擎,大概意思就是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this)。
这也是为什么箭头函数不能作为构造函数的原因。

相关文章

  • ES6箭头函数简介

    @(JS技巧)[ES6|箭头函数] ES6箭头函数(Arrow Functions) ES6可以使用“箭头”(=>...

  • es6全家桶(二)—— 箭头函数

    es6全家桶(二)—— rest参数、箭头函数 箭头函数 ES6 允许使用“箭头”(=>)定义函数。 var f ...

  • es6、js、css、jquery、vue以及程序设计 知识点总

    es6 列举常用的es6特性。 箭头函数this的指向。 eg:箭头函数的特性 箭头函数内部没有construc...

  • 箭头函数

    ES6允许使用“箭头”(==>)定义函数。 箭头函数 等同于

  • 学习 ES 6 箭头函数

    箭头函数的用法 ES6 允许使用“箭头”(=>)定义函数。 箭头函数的一个用处是简化回调函数。 箭头函数 this...

  • JavaScript箭头函数

    ES6新语法箭头函数 箭头函数是ES6新语法,因为语法简单、可读性好,所以使用的也很多。箭头函数也是匿名函数,区别...

  • 关于ES6箭头this的指向问题

    ES6 允许使用 “ 箭头 ” (=>)定义函数。 箭头函数 填 坑。 this的指向是 向上查找 非箭头函数的...

  • ES6箭头函数(Arrow Functions)

    箭头函数是什么?(What) 箭头函数 (Arrow Functions)也称“胖箭头函数”,是ES6全新的特性。...

  • 2019-01-11

    ES6 箭头函数 箭头函数表示法:()=>console.log('Hello') 箭头函数和普通函数的区别 和普...

  • js学习笔记4(函数)

    1.箭头函数 ES6新增属性。箭头函数特别适合嵌入函数的场景。 箭头函数虽然语法简介,但是很多场合不适用。箭头函数...

网友评论

      本文标题:es6 箭头函数

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