调用时机

1.

  1. let i = 0
  2. for(i = 0; i<6; i++){
  3. setTimeout(()=>{
  4. console.log(i)
  5. },0)
  6. }

打印 6个6
因为setTimeout回调会在代码执行完后在执行,此时i已经增长为6
2.

  1. for(let i = 0; i<6; i++){
  2. setTimeout(()=>{
  3. console.log(i)
  4. },0)
  5. }

打印0、1、2、3、4、5
因此每次再for循环的时候,内部悄悄地给复制出了一个i,有点奇葩
3.

  1. while(i<6){
  2. console.log(i)
  3. i++ }

所有函数都是由Function构造出来的

任何函数.proto === Function.prototype

如何传 arguments

调用 fn 即可传 arguments
fn(1,2,3) 那么 arguments 就是 [1,2,3] 伪数组

如何传 this

目前可以用 fn.call(xxx, 1,2,3) 传 this 和 arguments
而且 xxx 会被自动转化成对象(JS 的糟粕)
用use strict可以处理

箭头函数

箭头函数没有this arguments
let f1 = x => x*x
let f2 = (x,y) => x+y // 圆括号不能省
let f3 = (x,y) => {return x+y} // 花括号不能省
let f4 = (x,y) => ({name:x, age: y}) 直接返回对象会出错,需要加个圆括号(头疼)

代码

  1. function fn(){
  2. console.log(arguments)
  3. console.log(this)
  4. }

Call

  1. const animals = [
  2. {species: 'Lion', name: 'King'},
  3. {species: 'Whale', name: 'Fail'}
  4. ]
  5. for(let i=0;i<animals.length;i++){
  6. (function(i){
  7. this.print = function(){
  8. console.log("species: " + this.species + " name:" + this.name)
  9. }
  10. this.print()
  11. }).call(animals[i], i)
  12. }

一个重要的函数写法

  1. ajax('GET', '/xxx', {
  2. success(response){},
  3. fail: (request, status)->{}
  4. })
  5. //success 是function的缩写
  6. //fail 是箭头函数

重要:方方老师教程看懂this

https://zhuanlan.zhihu.com/p/23804247
把所有函数调用都在脑海中转化为function.call()