javascript(四):函数

194 阅读2分钟

函数的五种声明方式

函数内要加一句return undefined,如果你不加会自动帮你加上这一句,返回值和打印值没有关系。

  1. 具名函数
 function f(x,y){
     return x+y
 }
 f.name // 'f'
  1. 匿名函数
 var f
 f = function(x,y){
     return x+y
 }
 
 f.name // 'f'
  1. 具名函数赋值
 var f
 f = function f2(x,y){ return x+y }
 f.name // 'f2'
 console.log(f2) // 语法错误

区别就是外面能不能访问到y,绿色的圈是y的作用范围。第一个y都能够访问,第二个y只能够作用于函数里面。

  1. window.Function
 var f = new Function('x','y','return x+y')
 f.name // "anonymous"
  1. 箭头函数
 var f = (x,y) => {
     return x+y
 }
 var sum = (x,y) => x+y
 var n2 = n => n*n   //花括号和箭头一起去掉

小结

函数的name属性

函数的本质

函数没有办法直接使用,函数只能调用。

函数在内存里面是怎么表现的呢?将代码块当做字符串存储。

f指的是这个对象,f.call()是执行这个对象的函数体。

为什么说函数是一个对象,因为函数把方法体藏起来了,在你调用他的call函数的时候,方法体会执行。

百分百用f.call(undefined,1,2)

什么是this和argument

this的存在是历史原因,需要长得像java

在普通模式下,如果this == undefined,就会打印出window
在严格模式下,this == undefined,就不会帮你乱改了。

arguments是一个伪数组,他的__proto__指向Object.proto

call stack 调用栈

每执行一次,都将位置记下,继续运行,结束后立即跳回来,将位置消除,继续进行。

作用域

注意变量声明:将function和var提升到前面

看到代码就开始做必错,必须先进行变量提升

题目1:

思路:

变量提升之后:

题目2:

题目3

是否有可能在????中写一句话导致console.log(a)打印出2

答案:a = 2 思路:a只是容器,我们只能确定使用的是哪个作用域内的a,而不能确定a内到底存放的是什么

题目4

此时不管点击选项几,打印出来的都是6

变量提升之后的:

var是看不见for的,所以他变量提升提升到for循环的外面,for循环中也不是单独的作用域;

变量提升的规则就是提升到函数顶部

但是如果用let,for循环内部则是一个单独的作用域