JavaScript日常笔记(总汇)
记录看到,写到,想到的一些js小知识,以后会越来越多,有些可单独存在
匿名函数的运用http://i.cnblogs.com/EditPosts.aspx?postid=5099251
http://i.cnblogs.com/EditPosts.aspx?postid=5099251
所有的js代码中加入括号(注意是两个小括号包裹起来),作为一个匿名的函数来调用,这样的好处是避免了全局的污染,好处是显而易见的.
小括号能把我们的表达式组合分块,并且每一块,也就是每一对小括号,都有一个返回值。这个返回值实际上也就是小括号中表达式的返回值。所以,当我们用一对小括号把匿名函数括起来的时候,实际上小括号对返回的,就是一个匿名函数的Function对象。因此,小括号对加上匿名函数就如同有名字的函数般被我们取得它的引用位置了。所以如果在这个引用变量后面再加上参数列表,就会实现普通函数的调用形式。(引用:http://www.cnblogs.com/chenxianbin89/archive/2010/01/28/1658392.html)
变量作用域:
0.1函数可以把一个变量封装起来
function foo() { var x = 1; x = x + 1; } x = x + 2; // ReferenceError: x is not defined 无法在函数体外引用变量x
0.2两个函数定义了两个变量,那么,这两个变量各做各的事情,没有任何的影响
0.3函数内部可以嵌套,方法是先从内部开始访问,然后在访问外部的函数,而从外面访问就不行了。除非是在一个变量中,如果在声明之后的,先声明但是值不会传递返回undefined,
function foo() { var x = 1; function bar() { var y = x + 1; // bar可以访问foo的变量x! } var z = y + 1; // ReferenceError! foo不可以访问bar的变量y! }
//定义一个x = 1;
// 下面定义了一个函数bar(),里面定义了一个y 引用外面x,y的返回结构是2;证明这是可以引用的
//在bar()外面引用变量y,是没有办法引用的,原因是,作用域都是从内部往外面返回的,而bar()这个函数中虽然有y这个变量,当时,var z =y + 1;这条语句在bar()内部,所以就无法访问的到,那么就会返回ReferenceError!
另一个列子
function foo() { var x = 'Hello, ' + y; alert(x); var y = 'Bob'; } foo();
//这种说法叫变量提升(有意思的说法),打印出来foo的值为 hello,undefined,虽然在alert(x),下面定义了一个y的变量也给了值,但是浏览器还是会返回未定义。
//书的说法是,JavaScript的函数定义,会先扫描整个函数体的语句,把所有的声明变量“提升到”函数的顶部,
//y的变量虽然被提升到函数的顶部,也就是说,这个函数是可以被解析,但是没有赋值
//书上的说法是:虽然是strict模式,但语句var x = 'Hello, ' + y;
并不报错,原因是变量y
在稍后申明了。但是alert
显示Hello, undefined
,说明变量y
的值为undefined
。这正是因为JavaScript引擎自动提升了变量y
的声明,但不会提升变量y
的赋值。
function foo() { var y; // 提升变量y的申明 var x = 'Hello, ' + y; alert(x); y = 'Bob'; }
相当于这的写
0.4如果在函数中内部变量和外部变量重名的话,还是从内部运行,优先运算内部,而外部的变量定义自己的
function foo() { var x = 1; function bar() { var x = 'A'; alert('x in bar() = ' + x); // 'A' } alert('x in foo() = ' + x); // 1 bar(); }
返回两个alert(x in bar()= A)
x in foo() = 1;
我们在函数内部定义变量时,请严格遵守“在函数内部首先申明所有变量”这一规则。