JS基础之大杂烩

[TOC]

执行环境和执行环境对象

执行环境由函数在执行过程中发生的所有事物组成,所有函数中定义的变量和函数都是执行环境的一部分。变量在作用域内,即函数运行时变量在当前执行环境中,可访问
属于执行环境的变量和函数,被保存在执行环境对象中。执行环境对象是对执行环境的ECMA标准的实现。

enter description here
执行环境是Javascript引擎的一部分,在Javascript中不能直接访问。

js对象和原型链

javascript的对象是基于原型的,java对象是基于类的。

enter description here

enter description here

enter description here
每个方法中,首先创建了对象的模板。模板在基于类的编程中叫做,在基于原型的编程中叫做原型对象,作用都是为了用来:作为创建对象的结构。

创建构造对象,基于类的编程中构造对象在类的内部定义;在js中对象的构造函数和原型是分开设置的,需要用表2-3中的红框部分Prisoner.prototype = proto;将它们连接在一起。

最后,实例化对象。

函数

一个函数如果没有return语句,那它就只执行函数体中的每条语句,并返回undefined值给调用者。

函数定义

1
2
3
var func = function(name){
console.log("终端输出"+name);
}

嵌套函数

嵌套函数定义,test2只能在test中调用。不能再其他函数中调用

function test(){
    var a=1;
    function test2(){
        a++;
        console.log(a);
    }
    test2();
}
test();//2

console.log(); 终端打印输出,最早是火狐在fiebug中用来调试
作用域规则:嵌套函数可以访问嵌套他们的外部函数的参数和变量。

匿名函数

  1. 用一个局部变量来保存匿名函数
var prison = function(){
    ...
}
  1. 自执行匿名函数
    jquery的实现就是使用了自执行的匿名函数,
(function(){
    ...
})();

enter description here

传参

(function($){
    console.log($); //jQuery
    ...
})(jQuery)

可以将自执行函数保存在一个变量中,如下:

var worker = (function(){
    var person_name = "cc";
    return {
        name: person_name
    }
})();
console.log(worker.name); // cc

自执行匿名函数被用来控制变量的作用域,阻止变量泄露到代码的其他地方去。常用于创建Javascript插件,不会和应用代码起冲突,因为它不会向全局名字空间添加任何变量。

setTimeOut()及js引擎、线程

js引擎是单线程的,基于事件驱动的语言,执行顺序遵循一个事件队列的机制。js引擎处理到与其他线程相关的代码,就会分发给其他线程,他们处理完后需要JS引擎处理是,在事件队列后面添加一个任务。

<script>
    alert("1");
    setTimeOut("alert(2)",0);
    alert(3);
</script>

执行顺序1,3,2

可看出setTimeOut(fn,0);不是立即执行的。原因是:当程序执行到setTimeOut这里,会开启一个定时器线程,然后继续执行新的代码,该线程会在指定的时间后在事件队列里面插入一个新任务,所以setTimeOut中的操作会在所有主任务之后,执行顺序就是1,3,2了。
setTimeOut新解:在指定时间内,将任务放入事件队列,等待js引擎空闲时被执行
js引擎和GUI引擎(渲染引擎)是互斥的。一个挂起一个执行。
浏览器引擎是多线程的,它们在内核的控制下保持同步,一个浏览器至少实现三个常驻线程。:js引擎线程、GUI引擎线程、浏览器时间触发线程。

闭包

js采用词法作用域,即函数的执行依赖于变量的作用域,而变量的作用域是在函数定义是决定的,对应一个作用域链。函数对象可以通过作用域链相互连接起来,函数体的内部变量都保存在函数作用域内,这种特性在计算机中成为闭包。从技术的角度上讲,函数就是一个闭包。

function test() {
    var a = 4;
    return {
        add : function() {
            a++;
            console.log(a);
        },
        plus : function() {
            a--;
            console.log(a);
        }
    };
}
var c1 = new test();
var c2 = new test();
c1.add();//5
c2.plus();//3

两个变量不会相互影响。
初始化私有变量值

function test(n){
    return{
        get count(){
            return n++;
        },
        set count(m){
            if(n>m)
                n=m;
            else throw Error("ddd");
        }
    };
}
var t = test(100);
t.count;
console.log(t.count);//100
t.count=99;
console.log(t.count);//99
  1. 对象的方法调用
var a=1;
function test(){
    var a=3;
    console.log(this.a);
}
var obj={
        a:6,
        fn:test
};
obj.fn();//6
obj.fn.call();//1

this指向当前调用该方法的对象,使用对象的方法调用call,this默认指向的是全局对象,若想改变this指向

var a=1;
function test3(){
    console.log(this.a);
}
test3.call();//1
var obj={
    a:8,
    fn:test3
}
var para={a:9};
obj.fn.call(para);//9

call和apply都是Function对象的方法

  1. 构造函数
function test2(){
    this.a=7;
}
var o = new test2();
console.log(o); //7
  1. 嵌套函数的作用域
var a=1;
function test4(){
    console.log(this.a);//2
    function test5(){
        console.dir(this.a);//1
    }
    test5();
}
var obj = {a:2,fn:test4};
obj.fn();

prompt

1
2
var  username = prompt("what is your name?");
//username则可以获取到输入的参数

js中引用jsp代码

''中直接写JSP代码

1
2
3
4
5
6
7
function getCId(){
return '<%=session.getAttribute("cId")%>';
}
```


## JSON总结

//str->obj
JSON.parse();
//obj->str
JSON.stringify();
```

js字符串长度限制

是使用get传递参数,url无论如何都有2k的长度限制

文章目录
  1. 1. 执行环境和执行环境对象
  2. 2. js对象和原型链
  3. 3. 函数
    1. 3.1. 函数定义
    2. 3.2. 嵌套函数
    3. 3.3. 匿名函数
  4. 4. setTimeOut()及js引擎、线程
  5. 5. 闭包
  6. 6. prompt
  7. 7. js中引用jsp代码
  8. 8. js字符串长度限制