第三章,js的构建快
有三种基本的方式可以创建函数
1.声明式函数
声明式函数
声明式函数是通过fiunction关键字触发的
匿名函数
函数字面值或函数表达式
// 函数表达式(function expression) var h = function() { // h } // 函数声明(function declaration) function h() { // h }
如果使用一个声明式的函数,可以将其放置在代码中的任何位置,如果是用var的表达式,必须将其放置在函数调用的前面
声明式函数会发生变量提升,而var的函数不会
问题:有一段代码可能比较消耗时间,并且在等待其完成时,你不想阻塞其他的代码
解决方案
将一个回调函数和setTimeout()结合起来,定时器设置为0
回调函数的意思就是一个函数作为参数传递给另一个函数,在某个条件下在函数内部调用传入的函数,或者在一个进程的末尾调用它
闭包
在一个函数内部创建一个函数,让他们都访问该数据,然后从外围函数返回内部函数,从另一个函数返回一个函数,当返回的函数使用外围的函数的作用域的时候,这称为函数闭包
function outer(x){ return function(y){return x*y}; } var multiThree=outer(3); alert(multiThree(2)) //6
问题想要对一个函数的参数使用Array功能,但是argumengts对象并不是数组
//使用Array.prototype.slice(),然后是函数call()方法,将arguments集合转换到一个数组当中 function someFunc(){ var args=Array.prototyepe.slice.call(arguments) } //或者,如下是一种较为简单的方法 function someFunc(){ var args =[].slice.call(arguments); }
slice()方法返回了对数组的一部分的一个浅拷贝,或者如果没有给定起始值的话,就是整个数组的浅拷贝.slice()方法也是一个函数,这意味着,诸如call()这样的函数可以和他一起使用,在这段代码中,给call()传入了函数的arguments,她对参数列表执行必要的转换,把得到的数组传递给slice()
问题将NodeList转换为一个数组,让他可以用forEach()传递每一个节点
var nl = document.querySelectorAll("div"); var al = [].slice.call(nl); al.forEach(element => { console.log(element.textContent); });
使用匿名函数包装全局变量
问题:需要创建一个变量,在调用函数之间维护状态,但是,你想避免使用全局变量
(function(){ var i=0 function increment(){ i++ alert("values is"+i) } function runIncrent(){ while(i<5){ increment() } } window.οnlοad=function(){ runIncrement() } } )()
提供一个默认的参数
问题在调用函数时,如果没有给定参数值的话,你想要指定一个默认的参数
function makeString(str,Idelin="'",rdelim="'"){ return Idelim +str+rdelim } console.log(makeString(169)) //"'169'"