js总结

1.变量作用域

在函数体内,声明的同名变量,局部变量优先级高于全局变量,如果在函数内声明一个局部变量或者函数参数中带有的变量和全局变量重名,局部变量会覆盖全局变量,尽管在全局作用域可以不写var声明,但局部变量必须用var声明否则就是全局变量

2.声明提前

javascript 函数里声明的所有变量(但不涉及赋值)都被提前至函数体顶部,看一下下面的代码
var scope = 'gloabl';

function f ()
{
console.log (scope);
var scope = 'local';
console.log (scope);
}
这段代码局部变量在整个函数体始终是有定义的,函数体内的局部变量会覆盖同名的全局变量,只有在程序执行到 var 语句的时候局部变量才被真正赋值。因此上述过程等价于将函数内声明的变量提前至函数体顶部,同时变量初始化留在原来的位置


3.数组检测
Array.isArray ([])
instance of 不是检测数组的可靠方法  
4.类数组转化数组
类数组转换方法ES5的方法Array.prototype.call(a,0)这里a是类数组,通过call方法将类数组变成数组ES6中有更简单的方法,例如:
let arryLike = {'0': 'a', '1': 'b', '2': 'd', length: 3};
//es5
let arr = Array.prototype.slice.call (arryLike, 0);
//es6
let ary = Array.from (arryLike);

5.es5新的数组方法新方法使用三个参数,即数组元素、元素的索引、数组本身,新出现的方法不会修改它调用的原始数组,只是传递的函数可以改变数组

每个数组元素加1,forEach方法是可以改变原始数组的并且不需要return,其他方法需要return,并且不改变原始数组
var b = arry.forEach (function (v,i,a) { 
a[i] = v + 1
console.log (a)})
map方法
let arr1 = [1, 2, 4, 5, 6];
let c = arr1.map (function (value) {
return value * 2
});
filter()方法返回数组是调用数组的一个子集
let d = [1, 2, 3, 4, 5];
e = d.filter (function (x) {
return x > 2
});

5.闭包v
ar scop = 'gloable scop';
function checkscop ()
{
var scop = 'local scop';

function f ()
{
return scop

}

return f ();
}

var scop = 'gloable scop';

function checkscop ()
{
var scop = 'local scop';

function f ()
{
return scop

}

return f;
}

console.log (checkscop () ());

作用域链是函数定义时候创建的,嵌套的函数f()定义在这个作用域链里,其中的变量scop一定是局部变量,不管任何时候执行函数f(),这种绑定在执行f()时依然有效,因此最后一行执行的代码是"localscop",
而不是"gloalblescop"闭包的特性可以捕捉到局部变量和参数并且一直保存下来
再看下面的例子
function counter ()
{
var n = 0;
return {
count: function () {
return n++
},
reset: function () {
n = 0
}
}

}

var e = counter (), f = counter ();//创建两个计算器,两个计数器不互相影响
console.log (e.count ());//0
console.log (f.count ());//0
console.log (e.reset ());//reset重置n因为没有用var声明,所以n值是全局变量第二次自行f时候n为零不为1
console.log (e.count ());
console.log (f.count ());

6.call(),apply()方法

我们可以将call()、apllay()看做是某个对象的方法,通过调用方法的形式间接调用函数,call(),apply()第一个参数是要调用的函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用。要想对o对象的方法调用函数f()可以使用call(),apply()
f.call(o);f.apply(o)
在es5的严格模式中,call()和apply()第一个参数都会变为this,哪怕传入的实值是null、undefinde都会被全局对象代替
对于call来说第一个调用上下文实参之后就是要传入调用函数的值,比如对象o的方法形式调用函数f(),并传入两个参数可以使用如下代码:f.call(o,1,2)
apply()方法和call()类似,但call()传入的实参是放入一个数组中:f.apply(o,[1,2])
 
 
 


 

 
原文地址:https://www.cnblogs.com/zhx119/p/9883670.html