js函数和闭包

作用域

函数作用域

  • 在函数中,无论变量、函数声明先后,都会在调用时优先选择

    块级作用域

  • js中不存在块级作用域,局部变量作用域并不会局限于块级

    {
        for(var i=0;i<10;i++){
            //...    
        }
        //这里i值为10
    }
    
  • 但let声明的变量可实现块级作用域

闭包

  • 闭包函数返回值指向一个函数引用,所以闭包函数所赋给的变量不销毁的情况下,其对应的函数对象就不销毁,而且内部处在作用域链上的局部变量也就不会消失,达到具有状态的函数效果

回调

  • 回调函数没有状态,可以用bind(只绑定不立即执行,区别于call、apply)确定内部this引用

    //回调函数
    var emitter={ 
        callbacks:[],
        register:function(fn){
            this.callbacks.push(fn);
        },
        onOpen:function(){
                for each(var f in this.callbacks){
            f();
                }
        }
    };
    
    //待注册函数
    function MyClass(msg){
        this.msg=msg;
        this.show=function(){
        console.log(this.msg+' is called.');
      };
    }
    
    var obj1=new MyClass('listener1');
    var obj2=new MyClass('listener2');
    emitter.register(obj1.show.bind(obj1));
    emitter.register(obj1.show.bind(obj2));
    emitter.onOpen();
    
  • 使用匿名函数注册

    加载

  • DomContentLoaded(Dom解析完就执行,load还需等待图片加载)

    http://www.cnblogs.com/haogj/archive/2013/01/15/2861950.html

  • 动态加载

    跳转

  • location.href改写 : 会记录到history
  • location.assign(url) : 同href改写
  • location.replace(url) : 不会记录到history

关闭页面前提示

window.onbeforeunload = function(e){
    return 'some extra tips';
};
//点击其他链接则取消关闭提示
var dlinks = document.querySelectorAll('a');
for (var i = 0; i < dlinks.length; i++) {
    dlinks[i].onclick = function() {
        window.onbeforeunload = null;
    }
};

刷新

  • location.reload(true) : 忽略缓存刷新
  • location.reload(false) : 不忽略缓存刷新
  • location.reload() : 同false

Dom

  • live对象,始终具有Dom树的实体引用
  • 若遍历大量dom结果集(nodelist),转换为数组会更快 :Array.slice(结果集)
  • DocumentFragment对重复添加createElement,减少重绘次数

location

属性

属性描述
hash设置或返回从井号 (#) 开始的 URL(锚)
host设置或返回主机名和当前 URL 的端口号
hostname设置或返回当前 URL 的主机名
href设置或返回完整的 URL
pathname设置或返回当前 URL 的路径部分
port设置或返回当前 URL 的端口号
protocol设置或返回当前 URL 的协议
search设置或返回从问号 (?) 开始的 URL(查询部分)

这些属性都是可读写,相当方便跳转哦

方法

方法描述
assign()加载新的文档
reload()重新加载当前文档
replace()用新的文档替换当前文档

####Tips

  • 当一个 Location 对象被转换成字符串,href 属性的值被返回。这意味着你可以使用表达式 location 来替代 location.href。

  • replace() 方法不会在 History 对象中生成一个新的记录。当使用该方法时,新的 URL 将覆盖 History 对象中的当前记录。

如有疑问,请留言或邮件newbvirgil@gmail.com
本文链接 : http://blog.newbmiao.com/2015/02/28/js-function-closure.html