函数问题

变量的作用域

局部变量:定义位置在函数内部用var定义的变量,作用域是在定义的当前函数内部,只对当前函数有作用。
注意:如果在函数的内部不用var定义的变量默认是全局变量。

变量的提升

变量的提升?难道变量也像玩游戏一样,也会打怪升级?!其实不然。
首先,在一个程序内当局部变量和全局变量同名时,是优先使用局部变量的。但是当程序进入新的函数时,他会将所有的变量声明放在函数开始的位置,仅仅会提升变量的声明,而不会提升变量的赋值。这就是传说中变量的提升!

这里就定义了一个同名的局部变量和全局变量,在函数体内打印变量num的值。但是,奇怪的是此时打印出的num值为undefined,很奇怪吧!这就是因为变量的提升而导致的问题,而且还因为局部变量和全局变量同名。所以在一个程序中定义变量,尽量不要出现两个同名的变量。

函数也是一种数据

这个就直接上代码吧。
function fun(){ console.log("hello world"); } var f = fun; f(); fun();

这里就是用变量f保存了函数fun,可以通过变量f直接访问函数fun();此时,f与fun是等价的,结果会两次打印"hello world"。

函数问题_第1张图片
函数也是一种数据.PNG

匿名函数

匿名,匿名,也就是把名字给隐藏了,没有名字的函数。
当匿名函数没有赋值给另一个变量时有两种优雅的用法:

  1. 直接传递给函数
  2. 执行某些一次性的代码

function m(mySum,q,w){ return mySum(q,w); } var ret = m(function(a,b){ return a+b; },1,2) console.log(ret);

这里按照程序的执行来说;先是执行打印ret,通过ret去寻找m(function(a, b){return a + b;}, 1, 2);这里的function(a, b){return a + b;}可以看出是一个参数;紧接着又和m(mySum, q, w)匹配起来,执行m(mySum,q,w){return mySum(q,w)};数据1和2通过m方法传递给了q与w;通过mySum(q,w),传递给了a和b;两相结合,可以得出ret的值为3。

即时函数

即时函数也被称为自执行函数,当函数声明之后立即执行;
组成:(匿名函数)(给第一个小括号中的匿名函数传递参数);
第二个小括号表明函数立即执行,并且给函数传参。
代码如下:
(function(str){ console.log(str); })("Hello World")

这里会直接输出"Hello World"字符串。

总结:通过这次学习,也使我认识到了函数的各种不一样的使用方法,又涨见识啦!

你可能感兴趣的:(函数问题)