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>

对象的创建

创建一个没有任何属性的对象:

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);   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值