JavaScript Learning Notes One
内容为学习笔记,内容主要来自于JavaScript 标准参考教程(alpha)以及其他网上资源整理。
注意:JavaScript的执行过程是以行(line)为单位来顺序执行的,每一行就是一个语句,语句以分号;结尾表示结束。
变量提升:JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。
console.log(a);
var a = 0;
//undefind
上面的demo在JavaScript引擎解析代码时是按照下面demo解析的
var a;
console.log(a);
a = 0;
//undefind
break语句和continue语句都具有跳转总用,可以让代码不按既有的顺序执行。
break
语句用于跳出代码块或循环。
continue
语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。
函数声明与函数表达式的区别:
函数声明可以在函数定义之前调用,函数表达式不行。因为JavaScript解析器会在所有代码之前优先解析函数声明,而函数表达式只是在解析到当前行时才进行解析,所有两者之间的优先级是存在巨大差异的。另外,在if和try语句中进行函数声明,因为函数名的提升可能是无效的,这时用函数表达式就是正确的了。函数声明必须通过调用函数名才能执行函数,函数表达式可以直接执行。
具名函数与匿名函数的区别:
两者主要区别在于作用域范围,具名函数的作用域是全局的,可以在定义函数之前调用,且只有调用函数名才能执行函数;匿名函数会被当作函数表达式而不是一个标准的函数声明来处理.
匿名函数的缺点:
- 忽略了代码可读性
- 在栈追踪中不会显示有意义的函数名,造成调试困难
- 因为没有函数名,所以函数在调用自己时,必须使用过期的argument.callee
//匿名函数的第一种情形
var btn=document.querySelector("#btn");
btn.οnclick=function(){
// alert("aaaaa");
}
//匿名函数的第二种情形
setInterval(function(){
// alert("bbbbb");
}, 1000);
//匿名函数的第三种情形
var fun=function(){
alert("ccccc");
}
// fun();
//匿名函数的第四种情形
var obj={
name:"dddd",
say:function(){
alert(this.name);
}
}
obj.say();
立即调用的函数表达式:
//1,匿名函数的第一种实现方式
(function(data){
// alert(data);
})("eee");
//2.匿名自执行函数的第二种实现方式
(function(){
// alert("fff");
}());
//3.匿名自执行函数的第三种实现方式
!function(data){
// alert(data);
}("hhh");
//4.匿名自执行函数的第四种实现方式
var fun=function(data){
alert(data);
}("iii");
函数的作用域:函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。
函数的length
属性与实际传入的参数个数无关,只反映函数预期传入的参数个数。
闭包:闭包就是函数中嵌套一个内部函数,而这个内部函数可以引用外部函数的参数和变量,这些被内部函数引用的外部函数的参数和变量不会被垃圾回收机制所回收。
function Foo(){
var i = 0;
return function(){
alert(i++);};//i++即先执行再加1
}
var f1 = Foo(),f2=Foo();
f1(); //0
f1(); //1
f2(); //0