javascript变量声明和匿名函数的详细说明

1.。变量variable

a.全局变量Global Variable 和 局部变量 Private Variable

加var和不加var是有区别的 ,实质就是指明这个变量在Scope Chain所在的位置。
–》如果不用关键字var,声明一个变量,那么这个是全局变量,任何子函数都可以访问,就算是跳出花括号的地方,亦可被访问;
–》如果使用关键字var,则从所在的“花括号{}”起,全体函数都可以访问该变量,如:

function foo(){
i=8                    //Global Variable
alert(i)
}

function foo2(){
var i=88 //在此花括号下都可访问变量,声明scope chaine位置。
alert(i);
child()
function child(){alert(i)}
}
foo();foo2()
alert(i) //这里的i还是8

值得注意是function是编译期的对象,必须执行或实例化才能在内存中分配这一变量。


全局变量习惯以_开头;p.s全部变量最好慎用,你很难知道这个变量在哪里那个时候发生了变化!
——-》参见 js手册:
“尽管并不安全,但声明语句中忽略 var 关键字是合法的 JScript 语法。这时,JScript 解释器给予变量全局范围的可见度。当在过程级中声明一个变量时,它不能用于全局范围;这种情况下,变量声明必须用 var 关键字。”

b.变量的数据类型 the types of variable

Jscript 有三种主要数据类型、两种复合数据类型和两种特殊数据类型。

主要(基本)数据类型是:

字符串
数值
布尔
复合(引用)数据类型是:

对象
数组
特殊数据类型是:

Null
Undefined
下面简述一下JavaScript中的各种对象类型:
Native Object: JavaScript语言提供的不依赖于执行宿主的对象,其中一些是内建对象,如:Global、Math;一些是在脚本运行环境中创建来使用的,如:Array、Boolean、Date、Function、Number、Object、RegExp、Error。
Build-in Object: JavaScript语言提供的不依赖于执行宿主的内建对象,如:Global、Math;内建对象都是Native Object。
Host Object:JavaScript语言提供的任何依赖于宿主环境的对象,所有非Native Object的对象都是宿主对象,如:IE中的window,WScript中的wscript实例,任何用户创建的类。

****如何检查对象类型?******

1.typeof()
typeof 运算符把类型信息当作字符串返回。typeof 返回值有六种可能: “number,” “string,” “boolean,” “object,” “function,” 和 “undefined.”。

2.   val instanceof Array
返回一个 Boolean 值,指出对象是否是特定类的一个实例。
例如用到检查 数组或日期类型的时候(事实上,任何类型都允许,见例),必须使用instance of + class name(不用引号),例:

function foo(){}
var f = new foo();
alert(f instanceof foo2) //false

3.constructor
constructor 的用法感觉跟instance的用法一样,只不过不返回boolean值 返回构造函数

x = new String(“Hi”);
if (x.constructor == String)
// 进行处理(条件为真)。

*******var i={}是什么类型?****
答案:object类型 等价于var i = new Object();

Object对象是一切对象的载体,有点想父类天父天母吧

Object 对象很简单,
它就只有两个property和两个method
这两个property是:
prototype
constructor
这两个function是:
toString()
valueOf()

类实例文本化定义的语法为,用一对”{}”表示类,也就说”{}”完全等价于”new Object()”。然后”{}”内按”key:value”组织属性和方法,key可以是任意[A-Za-z0-9_]的字符组合,甚至数字开头都是合法的@_@,value是任何的合法的文本化JavaScript数据,最后每个键值对用”,”来分隔就行了。
通常用于JSON交换数据。

*******undefined 的两种含义*****
1.undefined关键字 2.undefined属性
声明了变量,但没赋过值,是属于第一种的情况;
完全没有声明,就跑出一个变量参与运算,它的数据类型是第二种情况;
两个相同名字却不同含义,建议下一版本改名。

var declared;                         //声明变量。
if (declared == undefined)            //改为uninitialized没初始化 会更准确 好理解
document.write(“declared has not been given a value.”);

if (typeOf(notDeclared) == “undefined”)
document.write(“notDeclared has not been defined.”);

-----------------------
再遇到一些JS的语法上的问题,没有理解透,恶补基本功!
匿名函数 An anonymous function

没有名字的就叫作“匿名函数”,像这个

function(x,y){return x+y}

没有名字当然不能直接调用,也无从直接调用;最多能只能把它赋值或闭包处理(闭包是什么下面再讲),如:

var sum =function(x,y){return x+y};

alert(sum(1,2));

这时候,与传统写法是等价的 function sum(x,y){return x+y}.这样的写法让人感觉更OOP,因为sum变量就包含了function…这个函数体;

还可以闭包的方式调用该函数:

(functioin(x,y){return x+y})(1,2) //返回值3

代码很简洁。注意括号的使用,形式为(exp)()。这种用法可以称作 闭包closure
后面括号的是参数,把这些参数放进fn里面立即计算,得出一个值 3。这实际上是一个表达式的运算。没想到fn函数体也可以放进去参与运算^_^(Using function as an expression)!(基本功:表达式Expression,其含义是通过计算后,始终会返回一个值,无论这个表达式有多长)

fn还可以以参数形式传递(passing function as argument to other functions)

var main_fn = function(fn,x,y){return fn(x,y)}

var sum = function (x,y){
return x+y;
}

alert(main_fn(sum,1,2)) // result:3

总结一下(by an IBM Engineer’s article, refer to IBM website,最好用心记一记)

Functions need not have names all the time.

Functions can be assigned to variables like other values.

A function expression can be written and enclosed in parenetheses for application later.

Functions can be passed as arguments to oher funcitons.

再谈闭包,闭包的作用是形成一个定义域,举一个很白痴的例子 1+(2+3),括号部分优先运算,或者换个说法,括号里面的归为一个范围,这个范围我不理你做什么事情都是你里面做的事情,与括号外界无关(好像是废话,–我是这样想的,就是这样写的@#@),程序上的理解也是这样。
Js有函数定义域function scope,因此,当使用this指向一个对象出现问题的时候,可考虑使用闭包。具体例子在:

掌握了ext Function下面的各个方法就只是this和作用域是什么了:

Something about aplly(),call(),createDelegate()
In JS, we use key word “this” to let the pointer point to the caller
If function is del like this,
function foo(){
this.id=’xxx’
this.go=funciotn(){}
}
Now, We’re no way to know what the function will be servered to, it depends on that the context object calls this function,   who calls the function and 执行(),who becomes “this”
so here,”this” stands for unknow or 潜在的 object
different among aplly(),call(),createDelegate()

ok, Next We’LL GO INTO EXT WORLD

转自: http://hi.baidu.com/zdz8207/blog/item/319291450224e03a86947327.html

相关文章

javascript变量声明和匿名函数的详细说明》有2个想法

  1. 脑袋说道:

    还可以闭包的方式调用该函数:

    (functioin(x,y){return x+y})(1,2) //返回值3

    代码很简洁。注意括号的使用,形式为(exp)()。这种用法可以称作 闭包closure。
    后面括号的是参数,把这些参数放进fn里面立即计算,得出一个值 3。这实际上是一个表达式的运算。没想到fn函数体也可以放进去参与运算^_^(Using function as an expression)!(基本功:表达式Expression,其含义是通过计算后,始终会返回一个值,无论这个表达式有多长)

发表评论

返回顶部