箭头函数和普通函数的区别

js箭头函数和普通函数的区别

1.不邦定this

在箭头函数出现之前,每个新定义的函数都有其自己的 this 值

var myObject = {
  value:1,
  getValue:function(){
    console.log(this.value)
  },
  double:function(){
    return function(){
      console.log(this.value = this.value * 2);
    }
  }
}

myObject.double()();  //希望value乘以2
myObject.getValue();  //1

在ECMAscript5中将this赋给一个变量来解决:

var myObject = {
  value:1,
  getValue:function(){
    console.log(this.value)
  },
  double:function(){
    var that = this;
    return function(){
      console.log(that.value = that.value * 2);
    }
  }
}

myObject.double()();  //2
myObject.getValue();  //2

除此之外,还可以使用 bind 函数,把期望的 this 值传递给 double() 函数。

var myObject = {
  value:1,
  getValue:function(){
    console.log(this.value)
  },
  double:function(){
    return function(){
      console.log(this.value = this.value * 2);
    }.bind(this)
  }
}

myObject.double()();  //2
myObject.getValue();  //2

箭头函数会捕获其所在上下文的 this 值,作为自己的 this 值,因此下面的代码将如期运行。

var myObject = {
  value:1,
  getValue:function(){
    console.log(this.value)
  },
  double:function(){
    //回调里面的 `this` 变量就指向了期望的那个对象了
    return ()=>{
      console.log(this.value = this.value * 2);
    }
  }
}

myObject.double()();
myObject.getValue();

2.使用call()和apply()调用

由于 this 已经在词法层面完成了绑定,通过 call() 或 apply() 方法调用一个函数时,只是传入了参数而已,对 this 并没有什么影响:

 var myObject = {
  value:1,
  add:function(a){
    var f = (v) => v + this.value;
    return f(a);
  },
  addThruCall:function(a){
    var f = (v) => v + this.value;
    var b = {value:2};
    return f.call(b,a);

  }
}

console.log(myObject.add(1));    //2
console.log(myObject.addThruCall(1));    //2

3.箭头函数不绑定arguments,取而代之用rest参数…解决

var foo = (...args) => {
  return args[0]
}

console.log(foo(1))    //1

4.使用new操作符

箭头函数不能用作构造器,和 new 一起用就会抛出错误。

var Foo = () => {};
var foo = new Foo();  //Foo is not a constructor

5.使用原型属性

箭头函数没有原型属性。

var foo = () => {};
console.log(foo.prototype) //undefined

6.不能简单返回对象字面量

var func = () => {  foo: 1  };
// Calling func() returns undefined!
var func = () => {  foo: function() {}  };
// SyntaxError: function statement requires a name
//如果要返回对象字面量,用括号包裹字面量
var func = () => ({ foo: 1 });

7.箭头函数当方法使用的时候没有定义this绑定

var obj = {
  value:1,
  add:() => console.log(this.value),
  double:function(){
    console.log(this.value * 2)
  }
}

obj.add();  //undefined
obj.double(); //2

8.箭头函数不能换行

var func = ()
           => 1; // SyntaxError: expected expression, got ‘=>‘

原文地址:https://www.cnblogs.com/mengshi-web/p/9780131.html

时间: 2024-08-03 20:10:00

箭头函数和普通函数的区别的相关文章

ES6——箭头函数与普通函数的区别

ES6标准新增了一种新的函数:Arrow Function(箭头函数). 为什么叫Arrow Function?因为它的定义用的就是一个箭头: 语法: //1.没有形参的时候 let fun = () => console.log('我是箭头函数'); fun(); //2.只有一个形参的时候()可以省略 let fun2 = a => console.log(a); fun2('aaa'); //3.俩个及俩个以上的形参的时候 let fun3 = (x,y) =>console.lo

箭头函数与普通函数的区别

本文链接:https://lienjack.github.io/Blog/knowledge/js/3.this.html#%E7%AE%AD%E5%A4%B4%E5%87%BD%E6%95%B0 本篇我们重点比较一下箭头函数与普通函数. 主要区别包括: 1.没有 this 箭头函数没有 this,所以需要通过查找作用域链来确定 this 的值. 这就意味着如果箭头函数被非箭头函数包含,this 绑定的就是最近一层非箭头函数的 this. 模拟一个实际开发中的例子: 我们的需求是点击一个按钮,改

检测某个方法是否属于某个类中--解析php函数method_exists()与is_callable()的区别

php函数method_exists() 与is_callable()的区别在哪?在php面相对象设计过程中,往往我们需要在调用某一个方法是否属于某一个类的时候做出判断,常用的方法有 method_exists()和is_callable() 相比之下,is_callable()函数要高级一些,它接受字符串变量形式的方法名作为 第一个参数,如果类方法存在并且可以调用,则返回true.如果要检测类中的方法是否能被调用,可以给函数传递一个数组而不是类的方法名作为参数.数组必须包含对象或类名,以将其作

javascript 函数声明和函数表达式的区别(学习笔记)

javascript中声明函数的方法有两种:函数声明式和函数表达式. 区别如下: 1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的. 2).以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用. 3).以函数声明的方法定义的函数并不是真正的声明,它们仅仅可以出现在全局中,或者嵌套在其他的函数中,但是它们不能出现在循环,条件或者try/catch/finally中,而 函数表达式可以在任何地方声明. 下面分别用两种方法定义函数:

函数声明与函数表达式的区别

1.函数声明 函数声明以function关键字开头,接着是必须的函数(变量)名和以逗号分隔的可选的参数列表,再接着就是以大括号封装的函数体.函数声明必须是一个单独的JavaScript语句. 2.函数表达式 在任何情况下都是其它JavaScript语句的一部分(比如复制表达式等号的右侧.函数的参数)的函数被称为函数表达式. 3.比较 //函数声明function myFunctionDeclaration(){ function innerFunction() {} } //以下为函数表达式 v

可重入函数与线程安全的区别和联系

1.可重入函数 可重入函数即表示可以被多个执行流重复进入,意味着只使用自己栈上的变量,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰. 一个不可重入函数的例子: int global; int fun( int a ) { int temp; global = a; temp = gloabl*2; return temp; } global是一个全局变量,若进程a运行这段代码传入的参数是2,预期的结果是4:进程b也运行这段代码,传入的参数是3,由于操作系统的进程调

PHP函数 mysql_real_escape_string 与 addslashes 的区别

addslashes 和 mysql_real_escape_string 都是为了使数据安全的插入到数据库中而进行的过滤,那么这两个函数到底是有什么区别呢? 首先,我们还是从PHP手册入手: 手册上addslashes转义的字符是单引号(').双引号(").反斜线(\)与NUL(NULL 字符). mysql_real_escape_string转义的字符并没有被提到,只是说了一句: 注意:mysql_real_escape_string() 并不转义% 和_. 为什么PHP手册没有说呢?因为

PHP函数addslashes和mysql_real_escape_string的区别

转自:http://www.jb51.net/article/49205.htm 这篇文章主要介绍了PHP函数addslashes和mysql_real_escape_string的区别,以及一个SQL注入漏洞介绍,需要的朋友可以参考下 首先:不要使用mysql_escape_string,它已被弃用,请使用mysql_real_escape_string代替它. mysql_real_escape_string和addslashes的区别在于: 区别一: addslashes不知道任何有关My

PHP合并数组array_merge函数运算符加号与的区别

两个的区别是:1.数组键名为数字键名时,要合并的两个数组中有同名数字KEY的时候,使用array_merge()不会覆盖掉原来的值,而使用"+"合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值"抛弃"掉(注意:不是覆盖而是保留最先出现的那个值).例子: $array1 = array(1=>'0′);$array2 = array(1=> "data");$result1 = $array2 + $arr