最近在刷廖雪峰的JS教程,把里面的本身不太清楚的东西在刷一遍。
教程网址:www.liaoxuefeng.com/wiki/001434…javascript
return
语句,函数执行完毕后也会返回结果,只是结果为undefined
。arguments
,它只在函数内部起做用,而且永远指向当前函数的调用者传入的全部参数。arguments
相似Array
但它不是一个Array
arguments
即便函数不定义任何参数,仍是能够拿到参数的值。function abs() {
if (arguments.length === 0) {
return 0;
}
var x = arguments[0];
return x >= 0 ? x : -x;
}
abs(); // 0
abs(10); // 10
abs(-9); // 9复制代码
rest
参数,他能够得到额外的rest
参数,rest
参数只能写在最后,前面用...标识,从运行结果可知,传入的参数先绑定a、b,多余的参数以数组形式交给变量rest
,因此,再也不须要arguments咱们就获取了所有参数。(若是传入的参数连正常定义的参数都没填满,也没关系,rest参数会接收一个空数组(注意不是undefined))function foo(a, b, ...rest) {
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
foo(1, 2, 3, 4, 5);
// 结果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]
foo(1);
// 结果:
// a = 1
// b = undefined
// Array []复制代码
return
语句必须在一行上,若是必须为多行返回,须要在retrun
后紧跟 {
,正确的多行写法以下:function foo() {
return { // 这里不会自动加分号,由于{表示语句还没有结束
name: 'foo'
};
}复制代码
var
在函数体内声明变量,该变量做用域为整个函数;由于这个缘由,在不一样函数内部用var申明的同名变量互相独立,互不影响。var
定义有个特色,它会先扫描整个函数体的语句,把全部var
申明的变量“提高”到函数顶部,因此定义变量时,咱们应该严格遵照在函数内部先声明的规则。window
,全局做用域的变量实际上被绑定到window
的一个属性上了。// 惟一的全局变量MYAPP:
var MYAPP = {};
// 其余变量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
// 其余函数:
MYAPP.foo = function () {
return 'foo';
};复制代码
let
替代var
能够申明一个块级做用域的变量。const
来定义常量,const
与let
都具备块级做用域,而且const
定义之后没法修改。let
和const
的特色,不存在变量提高、会形成暂时性死区、不容许重复定义。在一个对象中绑定函数,称为这个对象的方法。这里要介绍一个很坑爹的概念,就是this
的指向问题。java
那么对于不一样的调用,这个this
的指向分别是什么了??
答:this
的指向在函数定义的时候是肯定不了的,只有函数执行的时候才能肯定this
到底指向谁,实际上this
的最终指向的是那个调用它的对象。
在《javascript语言精髓》中大概归纳了4种调用方式:数组
1. 方法调用模式
2. 函数调用模式
3. 构造器调用模式
4. apply/call调用模式复制代码
特别补充:闭包
return
而且return
了一个对象,this
会指向这个return
的对象。this
指向undefined
(在非strict模式下,它指向全局对象window
)那么有没有办法去控制this
的指向了?
有的,可使用函数自己的apply
方法,它接收两个参数,第一个参数就是须要绑定的this
变量,第二个参数是Array
,表示函数自己的参数。另外一个与apply()
相似的方法是call()
,惟一区别是:app
apply()
把参数打包成Array
再传入;call()
把参数按顺序传入。bind()
方法,它会建立一个函数的实例,其this值会被绑定到传给bind()
函数的值。利用apply()
,咱们还能够动态改变函数的行为。
JavaScript的全部对象都是动态的,即便内置的函数,咱们也能够从新指向新的函数。函数
forEach
方法,是最基本的方法,就是遍历与循环,默认有3个传参:分别是遍历的数组内容item、数组索引index、和当前遍历数组Array。另外,除去第一个必须的回调函数参数,还能够接受一个上下文参数(改变回调函数的this
指向);而且forEach
不会遍历空元素。map
方法,基本用法与forEach
一致,可是不一样的,它会返回一个新的数组,因此在callback
须要有return
值,若是没有,会返回undefined
。(从字面理解,map就是映射的意思)filter
方法,用法和map
很类似,从字面理解,就是过滤、筛选的意思。可是函数的callback
须要返回布尔值true
或false
,而且返回值只须要为弱等==便可。some
方法,对数组中每一项运行指定函数,若是该函数对任一项返回true
,则返回true
。(一旦遇到true
,就会中断循环,返回true,相似于||判断)every
方法,对数组中的每一项运行给定函数,若是该函数对每一项返回true
,则返回true
。(一旦遇到false
,就会中断循环,返回false
,相似于&&
判断)sort
方法,默认把全部元素先转换为String
再进行ASCII码排序,因此这个很坑爹。要想正确的排序,须要添加一个函数。sort
方法,能够接受一个回调函数,默认有两个传参:分别是比较的数组项。「闭包」,是指那些可以访问独立(自由)变量的函数(变量在本地使用,但定义在一个封闭的做用域中)。换句话说,这些函数能够“记忆”它被建立时候的环境。特性:ui
this
对象,就是定义时所在的对象,而不是使用时所在的对象。new
命令,不然会抛出一个错误。arguments
对象,该对象在函数体内不存在。若是要用,能够用Rest
参数代替。yield
命令,所以箭头函数不能用做Generator
函数。Generator
函数是协程在 ES6 的实现,最大特色就是能够交出函数的执行权(即暂停执行)。next
法返回值的value
属性,是 Generator
函数向外输出数据;next方法还能够接受参数,向 Generator
函数体内输入数据。Generator
函数内部还能够部署错误处理代码,捕获函数体外抛出的错误。有错误但愿指出,必定会及时修改!this