函数是一个功能/方法;

定义一个函数n;

var n=null;

0和null区别;0是有一个数是零。null是连数都没有;

0相当于种树的挖坑;null相当于连坑都没挖;

 

arguments是函数内的机制;也称为类数组(以前有总结,需要再次总结);

带var和function关键字,进行预解释的时候是不一样的;

  • var:只是提前声明;
  • function是提前声明和定义都完成的;

预解释是在在当前作用域下的;function(){}的{}内的东西不是预解释的东西,因为他不是当前的作用域;if语句中{}内的是当前作用域的,因为它没有开辟新的内存空间(没有开辟栈内存)

function代码在执行之前(即预解释阶段)就把声明和定义完成了

在接下来执行代码的过程中,不再重新的定义;如果遇到函数定义的那块代码,直接跳过就可以了。

var和function使用的区别如下

  • //也就是说,function执行的时候,函数执行代码可以写在任何位置,因为预解释已经定义和声明了,可以在js里任意位置执行该函数。
  • //而全局作用域下的var一个变量。变量的引用必须要在var下面,因为var的预解释只是声明,没有定义(定义就是赋值的意思)

只有在全局作用域下才能预解释;

执行函数代码,会开辟一个空间,并在开辟空间中进行预解释;

  • 函数执行会形成一个新的私有作用域(栈内存)
  • 函数里有var的,首先也会进行预解释(私有作用域下预解释);
  • 在函数的这个私有作用域中定义的变量都是私有的变量,形成的这个作用域里面的私有变量不受外界的干扰,我们把这种机制叫做闭包;
  • 然后再进行函数里面的代码读取
  • 函数每执行一次就会形成一个新的私有作用域,步骤就是上述的步骤重复一次;
  • 一般情况下、每一次执行完成,函数新形成的作用域都自动销毁;

预解释是发生在当前作用域下的,只要发生在当前作用域内的,都会进行预解释;

首先是window下进行预解释,此时函数内没有预解释;只有函数执行的时候,函数内的变量才会进行预解释;

作用域套作用域是属于一个作用域链。

在JavaScript中除了有名字的函数外,还有一个叫匿名函数;

匿名函数包括:

  • 函数表达式
  • 自执行函数:定义和和执行放在一起执行的,在一起操作了,定义完进阶着就完成了;
<script>
var fn=function(){
}
</script>
<script>
var fn=function(){}//第一种函数表达式;
//oDiv.onclick=function(){}//第二种函数表达式;
window.setTimeout(function(){},1000);//第三种函数表达式;
(function(name){console.log("我的名字叫"+name)})("朱");//自执行函数的第一种方式;
~function(name){console.log("我的名字叫"+name)}("朱安");//自执行函数的第二种方式,和上面一样的;
;(function(name){console.log("我的名字叫"+name)})("朱安邦");//自执行函数的第二种方式,和上面一样的;";"可以防止上一行忘记加分号,可以有效分开;
</script>

闭包注意的:很多面试官以为下面这种才是闭包,面试的时候需要先写一个面试官能看懂的闭包,然后再写几个自己常写的闭包,

;(function(name){console.log("我的名字叫"+name)})("朱安邦");//自执行函数的第二种方式,和上面一样的;";"可以防止上一行忘记加分号,可以有效分开;

alert()这个语句也是一个函数;

typeof alert

返回是”function”

1111