javascript---function

2018-07-25  本文已影响0人  dsying

创建函数的5中方式

1 具名函数

 function f(x,y){
     return x+y
 }
 f.name // f

2 匿名函数

 var f
 f = function(x,y){
     return x+y
 }
 f.name // f

3 具名函数赋值

var f
 f = function f2(x,y){ 
     return x+y
  }
  f.name // f2  what fuck 什么鬼?为啥是f2
  console.log(f2) // undefined

4 Function构造函数 window.Function

 var f = new Function('x','y','return x+y')
 f.name // anonymous(匿名的意思)

5 箭头函数

var f = (x,y) => {
     return x+y
 }
 //如果{}内只有一句话 则花括号和return可以同时省略
 var sum = (x,y) => x+y
 //如果()内只有一个参数,则可以省略括号
 var n2 = n => n*n

函数的内存图

function.jpg

我们不妨模拟一下:
函数调用的过程其实就是eval(函数体)的过程

let f = {}
f.param = ['x','y']
f.fbody = 'console.log(111)'
f.call = function(){
    eval(f.fbody)
}
f.call() // 111

f 是一个对象,把函数体封装成一个属性,通过f.call()去执行这个函数的函数体

call

如何使用函数?答案:函数只能通过调用去使用,什么叫调用,英文翻译为call

   function f(x,y){return x+y}
   //语法糖
   f(1,2) //3
   //硬核玩家如何玩函数
   f.call(undefined,1,2) //3   
   // 第一种方法是js的一个语法糖,函数真正的使用方式应该是第二种,通过call调用  

this 和 arguments

this_arguments.jpg

this :当前函数运行时所在的环境(即this的指向),也可以说 当前函数运行时所处的对象(上述中undefined在普通模式下 指向全局对象 即 Window)

arguments: 当前函数的参数集合,它是一个类数组(likeArray)

你会发现如果你使用f(1,2)这种方法,虽然可以看出arguments,但是不能清除的看出该函数的this指向

普通模式下 undefined/null 会被潜规则而指向window


this_arguments2.jpg

严格模式下(use strict)


this_arguments3.jpg

scope 作用域

scope.jpg

是否听过这么一句话?

如果在声明变量的时候不加var 你就是在声明全局变量
例如:a = 3

  1. 优先认为这是一个赋值语句
  2. 它会在当前作用域寻找 a的声明,如果没有,沿着作用域树向上查找,如果全局scope也没有变量a ,只能退而求其次,先声明变量a 再执行 a=3


    ![scope2.jpg](https://img.haomeiwen.com/i10488548/10e25d86e44ae77b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

javascript 中作用域分为 全局作用域和函数作用域
只要有函数,就存在其对应的作用域
寻找一个变量的作用域 遵循 就近原则

上一篇 下一篇

猜你喜欢

热点阅读