创建函数的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.jpgthis :当前函数运行时所在的环境(即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
- 优先认为这是一个赋值语句
-
它会在当前作用域寻找 a的声明,如果没有,沿着作用域树向上查找,如果全局scope也没有变量a ,只能退而求其次,先声明变量a 再执行 a=3
![scope2.jpg](https://img.haomeiwen.com/i10488548/10e25d86e44ae77b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
javascript 中作用域分为 全局作用域和函数作用域
只要有函数,就存在其对应的作用域
寻找一个变量的作用域 遵循 就近原则
网友评论