JavaScript笔记
按段解释程序
javascript
在解释程序的时候是按照段来解释的,意思就是一对<script></script>
算作一段,示例程序:
<script type="text/javascript">
function mufunc()
{
alert("test!");
};
myfunc(); 输出 TEST
function mufunc()
{
alert("TEST!");
};
myfunc(); 输出 TEST
</script>
可以看到,最终对于myfunc
方法的解释是以段中的最后一个myfunc
方法为标准的
想要分别输出,就需要使用两对<script></script>
来将其分开
全局变量
由var
所定义的变量不是全局变量,示例程序:
<script type="text/javascript">
var yourName = "Bob";
myName = "Mike";
alert(myName + "::" + yourName);
function changeName()
{
var yourName = "Lily";
myName = "Jack";
};
changeName();
alert(myName + "::" + yourName);
</script>
我们在changeName
方法中使用var
关键字声明了一个yourName
变量,并赋给它一个值,但这个yourName
和外面的yourName
完全是两个变量,要想改变全局外面的值,去掉var
即可
因此,在声明变量时最好加上关键字var
,可以避免不小心更改全局变量的值
我们甚至可以再方法体中输出方法的具体内容,因为在JavaScript
中,方法本身也算作是一种变量
<script type="text/javascript">
function aFunc()
{
alert(aFunc.toString());
};
aFunc();
</script>
下面介绍一种追踪方法的调用者方法(利用变方法本身也是量的特点):
函数自身有一个caller
属性,这个属性用来表示当前函数的调用者,若caller
的属性值为null
,表示函数没有被调用或者是被全局代码调用
<script type="text/javascript">
function WhoCallMe()
{
alert("My caller is: " + WhoCallMe.caller);
};
function CallerA() {WhoCallMe();};
function CallerB() {WhoCallMe();};
alert(WhoCallMe.caller);
WhoCallMe();
CallerA();
CallerB();
</script>
可以看到,当我们调用CallerA
方法时,输出了CallerA
的方法体,因为**WhoCallerMe
方法是由CallerA
方法调用的**
方法除了有一个caller
属性外,还有一个callee
属性
示例程序:
<script type="text/javascript">
function create() {
return function(n) {
if (n <= 1)
return 1;
return n * arguments.callee(n - 1);
};
}
var result = create()(5); // returns 120 (5 * 4 * 3 * 2 * 1)
alert(result);
</script>
return function(n)
是一个匿名方法(没有具体的方法名),因此我们使用arguments.callee
属性来代替该方法
eval()
函数中动态执行的代码并不会创建新的作用域,eval()
代码就是在当前作用域中执行的。eval()
中的代码可以访问到当前作用域的this、arguments
等对象,因此可以使用eval()
实现一些高级的多态和动态扩展方面的应用
上面虽然讲了arguments
的caller
和callee
属性,但是这两个属性已经被废弃了
JavaScript的奇妙的对象
看一段代码:
<script type="text/javascript">
var anObject = {}; //该大括号不可省略,字典结构
anObject.aProperty = "Property of object";
anObject.aMethod = function(){alert("Method of object")};
alert(anObject["aProperty"]);
anObject["aMethod"]();
for(var s in anObject)
alert(s + " is a " + typeof(anObject[s]));
</script>
js
的操作就是这么随意,什么都可以是一个对象,我们可以随意地为它添加属性,并为属性赋值
这里说的对象,其实是一种字典结构
Javascript的this
示例程序:
<script type="text/javascript">
function WhoAmI()
{
alert("I'm " + this.name + " of " + typeof(this));
};
WhoAmI();
var BillGates = {name: "Bill Gates"};
BillGates.WhoAmI = WhoAmI;
BillGates.WhoAmI();
var SteveJobs = {name: "Steve Jobs"};
SteveJobs.WhoAmI = WhoAmI;
SteveJobs.WhoAmI();
WhoAmI.call(BillGates);
WhoAmI.call(SteveJobs);
BillGates.WhoAmI.call(SteveJobs);
SteveJobs.WhoAmI.call(BillGates);
WhoAmI.WhoAmI = WhoAmI;
WhoAmI.name = "WhoAmI";
WhoAmI.WhoAmI();
({name: "nobody", WhoAmI: WhoAmI}).WhoAmI();
</script>