1.作用域和其它语言不同
代码块不会建立作用域,如
<script>
function a()
{
if(true)
{
var b = "dfdf";
}
alert(b);
}
a();
</script>
打出dfdf
2.在或与且的问题上,如果前面的表达式满足条件,后面的表达式不会计算。
并且||与&&不仅仅是用来判断的,他们也返回值
alert(0||''||455||5656) //455
alert(45&&344&&33&0) //0
有一个办法来防止报错
alert(a.b&&a.b.c)
如果a.b没有会直接输出undefine,不然就会报错
3.[]这个东西更应该理解为属性防问,其实
function a()
{
this.b = 9;
}
var d = new a;
alert(d["b"]); 等于d.b;
4.js是先有一个编译过程的,这个过程是以一个<script>为单位的
<script>
a ();
function hh() {
this.b = 9;
}
function a()
{
this.b = 9;
alert(7);
}
</script>
下载完一块script后,先把方法编译好,再执行,所以这里工a()是可以执行的
但是如果是两个代码块
<script>
a ();
function hh() {
this.b = 9;
}
</script>
<script>
function a()
{
this.b = 9;
alert(7);
}
</script>
a()就执行不了,因为下面一个script块还没有加载上
var c = new hh;
for (name in c)
{
document.writeln(name + ":" + c[name]);
}
js 对象基本构成
首先我认为JS的基础是function, js必然有个最基本的function比如
function object()
{
}
我们所谓的var a = {} 实际是 var a = new object()
var a = 5 实际是 var a = new number();
就连var a= function(){} 这本身也是new了function
function 有几个属性 比如 prototype constructor
比如
Object.prototype.kk = 4;
var a = 6;
aler(a.kk) //4
你只要给object的prototype加上属性,任何实例都会有这样的属性
但是原生代码的function 比如object number string 他们的prototype只能加属性,不能替换
比如
Object.prototype = a;
这是行不通的
但是functiion这个对象本身,提供了一个可以替换的prototype
比如
function a()
{}
a.prototype = b;
这是有用的,如果你用调试工具,会发现其实a有两个prototype属性,一个是不可写的,一个是可写的。
关于prototype的用处,除了继承之外,也可以提高运行效率
function abc() {
this.a = function () { alert() };
this.b = 5;
alert(2);
}
function dd() {
alert();
return 1;
}
abc.prototype.al = dd();
var d = new abc;
var c = new abc;
如果把al写进function里面,就是写进了,constructor里面,每次new的时候,都会去执行,如果写在prototype里面,只会执行一次