之前一些日子可以说大部分与API打交道,这东西不是很伤脑筋,用勤奋可以达到熟练和熟悉的阶段。但对于数学系出身的我,刨根问底了解根源几乎是一个强迫症。

所幸公司里有个小伙子写过很多程序项目,而且又乐于分享知识。我能够多多发问获得很多知识。

我觉得程序这件事情需要深入研究的有这几样:

  1. 源码—–查看API的各个接口到底是什么鬼
  2. 别人的代码—–看看别人写的代码有啥出色和不好的地方,取长补短
  3. 查看内存形式——-debug调试各类变量,查看内存中的变量形式
  4. 学习和写代码两者结合,毕竟需要把脑中的想法实现出来

今天clone了趣分期移动端的网页,发现手机上显示的字体和PC端大概有1.2倍的视差,于是查看了相关的资料及做了测试。

首先有两个概念:DPI PPI这两个概念相信做移动端的朋友都有了解过。

PPI的不同,直接导致在不同屏幕上网页的缩放比例[前提是设置了width= device-width]。

code_test

摘录一段Mozilladeveloper的原话:

For web developers, this means that 320px be full width in portrait mode at scale=1, on all of the above-mentioned handheld devices, and they may size their layouts and images accordingly. But remember that not all mobile devices are the same width; you should also make sure that your pages work well in landscape mode, and on larger devices like the iPad and Android tablets.

 

糟糕,貌似截图不是很清晰。。。

大概的意思就是我做用iPhone4s做了个测试,ppi是114.82(用width 320px 算);电脑端是97.9,也是就说手机上看电脑上用px做的东西,将缩小114/97=1.18倍。

夜深了,睡了~毕竟程序员

关于Js的闭包问题,主要原理======内部函数可以访问定义它们的外部函数的变量和参数。

关于这一点首先要澄清:

  1. 内部函数是类似(function(){})()这种形式的,直接返回值,即回收内存。这种情形没啥影响。
  2. 内部函数是类似 var func= function(){return value};若内部函数调用了外部函数的变量,这里会出现大问题。主要是因为JS在执行的时候,只是将它挂载起来并不解析具体操作。因而,在后续操作的时候,外部变量如果用了类似For循环之类的话,可能结果就不是我们想要的结果了。解决方案有两种:1/ var func= function(){return value};在此函数外部再开辟一个变量指向for 循环的变量,然后在此内部函数使用。2/直接采用var func=( function(外部变量){return function(){value}})(外部变量);
  3. 上述第二点的两种方法殊途同归,就是复制挂载的函数中引用的外部变量,避免真正 执行时出现我们不希望的效果

这两天学习了下requirejs,还是通过

  • 研究部分源码
  • 研究内存变量
    内存变量

可以看到无论代码多么简单,内存中都回存在filename和dirname变量,这是程序解析代码文件路径始终存在的变量。

在解析require依赖的模块路径时,如果没有设置baseurl,则baseurl默认值为html所在文件的dirname;这一点是基础。然后requirejs按照baseurl+path的方式寻找依赖模块,进行后续加载

 

jQuery.each( (“blur focus focusin focusout load resize scroll unload click dblclick “ +
“mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave “ +
“change select submit keydown keypress keyup error contextmenu”).split(“ “), function( i, name ) {

// Handle event binding
jQuery.fn[ name ] = function( data, fn ) {
return arguments.length > 0 ?
this.on( name, null, data, fn ) :
this.trigger( name );
};
});
类似$(document).click(console.log(hello)),实际上并没有将函数挂载成callback机制,不需要data,即可运行,因此控制台输出hello就结束了,事件没有绑定成功。

document.onclick=function(data){
console.log(data);
}

点击浏览器窗口后,data输出MouseEvent 对象进一步说明callback机制。

写到这,不得不赞叹下JS中存储数据的对象机制,完全的OOP模式有木有。

看样子JS这门语言还是很精妙的

 

主要机制

  1. RequireJS的目标是鼓励代码的模块化
  2. 它鼓励在使用脚本时以module ID替代URL地址
  3. RequireJS默认假定所有的依赖资源都是js脚本,因此无需在module ID上再加”.js”后缀,RequireJS在进行module ID到path的解析时会自动补上后缀
  4. <script data-main=“js/app.js” src=“js/require.js”></script>

  5. data-main主函数入口

AMD规范全局变量

本规范保留全局变量”define”以用来实现本规范。包额外信息异步定义编程接口是为将来的CommonJS API保留的。模块加载器不应在此函数添加额外的方法或属性。

本规范保留全局变量”require”被模块加载器使用。模块加载器可以在合适的情况下自由地使用该全局变量。它可以使用这个变量或添加任何属性以完成模块加载器的特定功能。它同样也可以选择完全不使用”require”。

在JavaScript当中存在大量的异步函数应用场景。尤其在操作DOM树的时候,挂载到相应事件的函数往往都是匿名函数(直接就是function(){});由于匿名函数一经调用立即执行的特性,函数体内部的变量并不分配独立的内存空间,而是指向当前函数体所在环境的变量引用。

例如FOR循环当中:

例子一:

var arr =[];
(function(){
for(var i= 0;i<5;i++){
arr[arr.length] = (function(i){
return function () {
return i
}
})(i)
}
})();

console.log(arr3)
如上所示的代码最后的结果是3,最后下滑线标注的return i所指向的内存地址是橙色变量开辟的。

例子二:

var arr =[];
(function(){
for(var i= 0;i<5;i++){
arr[arr.length] = (function(i){
return function (i) {
return i
}
})(i)
}
})();

console.log(arr3)
上例的结果是undefined;因为匿名函数中的参数i,创建了暂时的内存区域并没有赋值。

例子三:

var arr =[];
(function(){
for(var i= 0;i<5;i++){
arr[arr.length] = function(){
return function () {
return i
}
}
}
})();

console.log(arr3())
代码运行的结果是5。原因是函数运行结束后,由于匿名函数指向的变量i来自它所处的环境,本身匿名函数并没有新开辟存储空间,所以在循环结束后,return的i值依旧是5。

例子四:

闭包的另外一种形式,是显式的定义函数

var arr =[];
(function(){
var fun =function(j){
return j
}
for(var i= 0;i<5;i++){
arr[arr.length] = fun(i)
}
})();

console.log(arr[3])
代码运行结果是3,因为fun(i),形参开辟了临时内存存储变量i的值,而不是指向i的实际内存地址。