文章地址
按段解释程序
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>
对象的创建
创建一个没有任何属性的对象:
var o = {};
创建一个对象并设置其属性:
var bachelor = {name: “test”, age: “19”, married: false};
创建一个对象并设置其属性和方法:
var speaker = {text: “fool me once, shame on you, fool me twice, shame on me”, say: function(){alert(this.text)};
创建一个很复杂的对象,嵌套其他对象和对象数组:
var complicated =
{
name: "Microsoft",
product: "Windows",
chairman: "Bill Gates",
employee: [{name: "Angle", age: 26}, {name: "Demon", age: 62}],
readme: function(){document.write(this.name + " product " + this.product);}
};
complicated.readme();
这就是JavaScript Object Notation,简称JSON,以很简洁的字典形式创造各种各样的JavaScript
对象
除了使用JSON
外,还有另一种方法也可以创建Javascript
对象,使用New
操作符结合一个函数的形式来创建对象,例如:
//首先构造一个空函数
function MyFunc() {};
//以下两种方式是等效的
var anObj1 = new MyFunc();
var anObj2 = new MyFunc;
JavaScript
也可以有自己的构造函数:
//含参构造函数
function Person(name)
{
this.name = name;
this.SayHello = function()
{
alert("Hello, I'm " + this.name)
};
};
function Employee(name, salary)
{
Person.call(this, name);
this.salary = salary;
this.ShowMeTheMoney = function()
{
alert(this.name + " has " + "$" + this.salary);
};
};
var BillGates = new Person("Bill Gates");
var SteveJobs = new Employee("Steve Jobs", 1234)
BillGates.SayHello();
SteveJobs.SayHello();
SteveJobs.ShowMeTheMoney();
alert(BillGates.constructor == Person);
alert(SteveJobs.constructor == Employee);
alert(BillGates.SayHello == SteveJobs.SayHello);