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()实现一些高级的多态动态扩展方面的应用

上面虽然讲了argumentscallercallee属性,但是这两个属性已经被废弃

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>

JavaScript笔记