xhr.onload和xhr.onreadystatechange

一个关系不是很大的有趣链接:理解formdata,Blob等数据类型

我在这文章里看到张哥关于ajax的xhr.onload的写法,想起我们以前不是又得onreadystatechange,又得readystate,
所以产生了疑问:xhr.onloadxhr.onreadystatechange效果一样吗?
Stack Overflow的高票回答:Is onload equal to readyState==4 in XMLHttpRequest?
答案:这是xhr2才有的,如果浏览器支持就用,一样的。虽然说不是高票回答就是真理,但心理看着踏实是肯定的。。。

另外:Stack Overflow打开缓慢不是服务器太远的原因,跟墙有关。但墙的不是它,是它引用了谷歌下的jq。。。火狐有插件可以让他禁止加载这些不能加载的东西。哎,哎,哎。

完。

有趣的this,对与编译器的一些猜想

话不多少,上马

    var a=1;    
    var obj={
        a:2,
        ga:function(){
            return this.a
        }
    }
    console.log((obj.ga=obj.ga)());//1
    console.log((obj.ga)());//2
    console.log((b=obj.ga)());//1

根据8跟10行,我只能斗胆猜测:
编译器为了省事,直接利用obj.ga得到的值进行xx.()这种函数调用,导致不管谁调用this指向都是全局的this。。。

挖个坑吧,我很想被打脸的。
完。

关于jQuery的remove和clone等需要注意的地方

jquery的remove这个api与detach的区别文档中的解释是:前者不仅删除元素,还把其属性删除。后者也是删除,但保留绑定在元素上的事件,属性这些。
就绑定事件这一项来说:
第一次,我用js的.onclick给元素a加了个事件,用jq的remove删了再加回去,发现没效啊!事件还在。
第二次,刷新,用jq的click给元素a加事件,再同样的一番操作,嗯,事件没有了。
结论:这里有个坑!remove清除的是用jq加的事件,用js加的没有清掉。
所以引出了我的一个猜想加模糊的印象:jq加事件是把事件放在一个队列里,用时去取,而不是简单的用js的实现方法代替。
猜想对不对呢?跟我哪天看看源码再回来回答这个问题,挖坑要紧!

正义

  最近开始看杜兰特的《哲学的故事》,原来那么丰富的精神世界,思考世界的方法,给我有种相遇恨晚的感觉。ps:其实也不是看,我在喜马拉雅上听的哈哈,等听完在买本英文版的看看:)
  有些思考,有些感触,我想通过博客记录下来。所以就有了这个系列。这里只有开始。

  在一次讨论中,苏格拉底问了智者正义是什么,其回答是统治者需要的工具,是平民、懦夫掩饰自己弱小的遮羞布。(大概这意思啊)

  这观点有意思的。所以,足够强大是不是不需要正义?这里先不给正义下定义,嗯。。。你觉得是什么就是什么。足够强大是什么意思,我们先来试试定个标准:

强大到不需要世界

那这时好像还真不需要正义。。。除非宇宙正义存在(有其他生命,并对我们能造成威胁)

强大到统治世界

正义可以维护和平,嗯你很强大,你暂时不需要正义,但你的世界需要正义,不然你的世界完了你还统治啥?所以世界需要正义。你需要统治的世界存在,所以你,需要正义。好了,需要正义,是我的结论。


正义,是懦夫的遮羞布?
没错,虽然懦夫在这里丑化了人,但是,每个个人真的很渺小,小到需要正义来团结我们的力量,来制约‘邪恶力量’。承认弱小,是我们普通人认识正义的第一步。统治者有责任优化改进正义,普通人有义务有必要维护正义。win win。双赢,最优解?
这里有些惯性思维。‘没有正义,世界肯定混乱。’你怎么知道的?世界混乱是没有正义引起的?‘世界混乱是人的欲望引起’。所以正义限制了人们的欲望了没?好像有。好像还引导着人们的欲望。那么正义有没有制约着统治者(强大的人)的欲望呢?这里引出某一派的说法,‘道德是弱者制约强者的工具’。
断。

正则小进阶

分组,断言详解
对于有正则基础的同学,
配合上面的参考文献,
()分组配合\数字的引用 (?=n)、(?!n)这种前向断言 (?<=n)、(?<!n)这种后向断言。嗯,正则基本够用了。ps:js里没有后向断言!!!s里没有后向断言!!!s里没有后向断言!!!气的昏古七
完。(额,好像断言的名字跟参考文献里作者提的不同,算了 我就喜欢这么叫它,只是为了好记哈哈)

js的面向对象编程

这里只贴出参考文献,按顺序看就好。
so easy!
详解JS类概念的实现
然后看看阮一峰老人家的三篇系列:
Javascript 面向对象编程(一):封装
最后看着玩的一篇,如果前面的理解过了,那么你可以发现这篇一些问题。(看不出问题去看评论= =):
Javascript定义类(class)的三种方法

我总结下,关于继承在JS实现的技术上只有两点要提:
1.为了继承父级私有属性,apply很重要。
2.为了不让父级的私有属性污染子集的原型,new构造函数很重要。
最后提醒,constructor记得指回正确的构造函数。

如果你还是真的真的真的不能理解为什么要这样做?
那就试着理解下这句话

“子类继承父类后:
一,子类的私有属性要继承父类的私有属性。私有的意思就是自己身上的,不用在原型链里找的
二,而父类的公共属性就通过原型链给子类用就好。”

完。

同源策略及规避方法

实现要贴的是来自大神阮一峰的参考文献:浏览器同源政策及其规避方法
然后是window.name的作用示例: window.name 跨域实现原理及实例
HTML5安全:CORS(跨域资源共享)简介。。。ie67不要想了。。。
看完以上文章觉得真是精彩,但有些知识点个人认为值得注意注意。
1. window.name容量为2mb,出现的目的是起初是为了解决cookie小的问题(80kb)
2. window.name在通讯前还是需要跳转到同源名下的网址,但window.name中的信息不变,进而实现通讯(结合上面第二个参考文献看,会发现和不能跨越的ajax配合,爽歪歪!!!)
3. ajax不能跨域?用cors可以,而且ie8支持(对于现在来说我认为一般ie8支持就算可以随便用了!),值得注意的是服务器需要设置Access-Control-Allow-Origin,如果是别人家的服务器。。。那么你就想想别的路子吧。(cors使用请参考开头提供的第三个文献)
4. 更方便简洁的方法是postMessage,h5的api,兼容性就呵呵啦。要注意的是该api的语法:
otherWindow.postMessage(message,targetOrigin, [transfer]);
其中特别特别特别注意otherWindow

MDN原文解释:otherWindow:其他窗口的一个引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。MDN原文解释:otherWindow:其他窗口的一个引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。

这里第一次见到会有点措手不及,比如我给你个东西,主语应该是‘我’,这里是‘你’的感觉。。。

完。

我保证,超级超级简单的弄明白this指向

首先盗张图,来源:图解javascript this指向什么?

完。
好吧,其实我想介绍的是setTimeout和this之间的故事,也可以加深this的理解:)

obj={
    a:1,
    fn:function(){console.log(this.a)}//执行obj.fn()时打印1,此时this为obj。
}

obj={
    a:1,
    fn:function(){setTimeout(console.log(this.a),1000)}//执行obj.fn()时还是打印1,此时this为obj。
}
obj={
    a:1,
    fn:function(){setTimeout(function(){console.log(this.a)},1000)}//执行obj.fn()时还是打印undefined,此时this为window。
}

END

关于事件绑定的this指向,和匿名函数的解绑方法

事件绑定的this指向

原来addEventListenerattachEvent的this指向不同,前者是调用该函数的对象(合理)。后者是Window(可能还有别的,比较alert也看不了什么,console又用不了,嗯你知道我在说IE)。
要修正指向就用bind()咯。

事件解绑中的匿名函数

都知道匿名函数解绑不是长的一样就可以的,因为他们是引用类型,长的一样在内存地址中却是不同。故可以将匿名函数存到对象的自定义属性里,等解绑时判断解绑填的函数参数是否跟自定义属性长的一样(判断长的一样用toString转化为字符串来比较),长得一样的话就用赋值把函数参数(用来解绑的)给换成自定义属性对应的函数(这样就同一个了)
完。