原生JS函数部分整理

1:函数的声明
这里想要说的是变量提升,JS中作用域只存在全局和函数作用域,(ES6中才开始提及块级作用域)
理解作用域:
for(var i=0;i<10;i++)
;
console.log(i) ;
//答案为10,(具体不解释了)
在全局作用域中所有声明的变量会提到最前面声明,所以
x=10;
var x;
console.log(x);
//答案就为10
同理:那块级作用域中声明的变量就会被提到函数刚刚开始处声明;
这一小节说的是函数的声明,函数是什么?不就是变量嘛!
function ff(){
console.log(10);
}
typeof ff;
//答案”function”
ff instanceof Object;
//答案true
嗯,最后一点,这是JS不是C++所以不存在函数重载。一旦发现,后者必将取代前者。
嗯,再来一点,不能在条件语句中声明函数。(乌龟的屁股!!)

2:函数的参数
传参:按值传递,实参传给形参;
如果实参为原始数据类型,传值。
如果为引用数据类型传引用。
但是在函数声明时函数的参数又不是必须写上的,或者与调用时传递的个数相同。所以:
function fun(a,b){
console.log(a+’\t’+b);
}
fun(1);
//答案1 undefined
fun(2,1);
//答案2 1
前面说了声明时是可以省略的,那省略掉就用argument类数组对象来接收参数。
(function fun(){
console.log(typeof arguments);
})();
//答案是object

(function fun(){
console.log(arguments[0]);
})(1);
//答案是1

(function fun(){
console.log(arguments[1]);
})(1);
//答案是undefined
嗯,不定义严格模式的情况下,可以用arguments来修改值。严格模式下,arguments只能读,修改不会报错但是修改无效。

3:其它
闭包:实际上就是一个作用域的问题;简单点说:函数A内部声明另一个函数B,即为内部函数(指B),都是自己人了,访问在内部函数(B)中访问你函数(A)内部的变量就没毛病了。还有就是让这些变量始终保持在内存中,嗯,这个问题有涉及到内存回收了。(内存回收红宝书有说,这里放个相关例子)
function add(x){
return function(){return x++};
}
add(0)();//答案0
var temp=add(1);
temp();//答案1
temp();//答案2
temp();//答案3

把arguments转为真正的数组:(这样我就可以用你数组的方法了,感觉说法不恰当):
(法一):
var args = Array.prototype.slice.call(arguments);
//运用slice方法
(法二):
var args = [];
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
//直接把arguments的内容读出来,填到定义的数组里。其实主要是让arguments把他的东西交出来。
arguments callee属性:(严格模式下禁用)
既然对象就有属性;
(function(){console.log(arguments.callee)})()
//答案,ƒ (){console.log(arguments.callee)}。嗯,参考红宝书的讲法,callee属性是个指针,指向拥有arguments这个对象的函数,返回它所对应的原函数,是用递归的例子来讲解的这个属性
function x(num){
if(num<=1)
return num;
else{
return x(num-1)*num;
}
}
等价于
function x(num){
if(num<=1)
return num;
else{
return num*arguments.callee(num-1);
}
}
书上的说法是解耦合,嗯,总之就是会方便点。

作用域提升:with和try-catch语句延长作用域链,还是没太能理解红包书上的解释,先记下吧。

this指向:(嗯,这个又提及执行上下文)
在函数中this指向调用对象,和C++,Java的理解相同,需要注意的是ES6中箭头函数中this的指向
(()=>{
console.log(this);
})()
//答案 Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
嗯,参考了下别人的例子
var x=11;
var obj={
x:22,
say:()=>{
console.log(this.x);
}
}
obj.say();
//输出的值为11

eval 命令:
eval命令的作用是,将字符串当作语句执行。
eval(“var x=10;x”)
//答案10

你可能感兴趣的:(原生JS)