1. 函数:
执行一个明确的动作并提供一个返回值的独立代码块。同时函数也是javascript中的一级公民(就是函数和其它变量一样)。
2.函数的声明方式:
1> 函数声明:在函数里,必须手动去声明函数的返回值,如果返回值没有申明,则此函数返回值为undefined,,return是函数内部使用的,形参能自动声明,而实参不能自动声明为undefined。我们在调用函数时要:函数+()这种形式。不然就是函数本身。function fn(){console.log("welcome");}
2>函数表达式:例如var fun=function(){console.log("hello");}
3>立即执行函数(IIFE):例如(function(){})()
4>创建FUNCTION对象:例如 var func=new Function("one","two","return one+two");
anguments:不是数组,却有数组的相关属性,是一个伪数组,类似元素集合,就算没有定义形参,一旦把实参传进函数,也可以访问到,例如:length。
3.值传递和引用传递的区别:
1>值传递:声明的是原始的类型,具体的值,传给变量后,就与它本身没有关系了。
2>引用传递:把地址传给变量,传完后变量的值会跟据变量的变化而变化 。
4.可执行代码和执行上下文:
1>可执行代码:全局代码、函数代码、eval()代码(出于安全着想,一般不建议使用此类代码)
2>执行上下文:执行代码的一个环境,环境会随着代码结束而结束,执行代码不断产生执行上下文环境。js中量声明给它的位置无关(变量提升),块作用域(js中没有这个作用域)
5.变量和变量的初始化:
当一个变量在声明时,就把变量存在变量对象中,变量对象(vo) #
如果没有给一个变量定义却给它赋值,那变量就会成全局变量了。例如:a=b,前提又没有给a定义。
6.作用域(链):
当一个范围里没有给这个变量定义时,我们就会上一层找,那么我们为啥函数能往上一层找啊?
因每一个作用域对象中有一个vot和scope,而每一个scope保存上一层的vo(变量对象).scope对象是在函数声明时,它就已经存在了,是它所在的作用链的对象,