随笔以防止忘记
闭包
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>闭包</h1>
<hr />
<script type="text/javascript">
// var name="我是外部 变量"
// var obj={
// name:'我是内部变量',
// getName:function(){
// return function(){
// return this.name
// }
// }
// }
// alert(obj.getName()())
//函数中的this一般是指向window中的变量
// 闭包 事例 二
// var name="我是外部 变量"
// var obj={
// name:'我是内部变量',
// getName:function(){
// var that=this
// return function(){
// return that.name
// }
// }
// }
// alert(obj.getName()())
// 将 this
//闭包 理解 三
function test1(e){
var n=999
add=function(){n+=1}
function test2(){
alert(n)
}
return test2
}
var resout=test1()
resout()
add()
resout()
//f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,
//而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
//这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,
//首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function)
//,而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
</script>
</body>
</html>
移动端适配链接(淘宝弹性布局方案https://www.cnblogs.com/lyzg/p/5058356.html)
获取网页 宽高 元素定位
因此,document元素的clientHeight和clientWidth属性,就代表了网页的大小。
function getViewport(){
if (document.compatMode == "BackCompat"){
return {
width: document.body.clientWidth,
height: document.body.clientHeight
}
} else {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
}
}
}
//上面的getViewport函数就可以返回浏览器窗口的高和宽。使用的时候,有三个地方需要注意:
//1)这个函数必须在页面加载完成后才能运行,否则document对象还没生成,浏览器会报错。
//2)大多数情况下,都是document.documentElement.clientWidth返回正确值。但是,在IE6的quirks模式中,document.body.clientWidth返回正确的值,因此函数中加入了对文档模式的判断。
//3)clientWidth和clientHeight都是只读属性,不能对它们赋值。
//三、获取网页大小的另一种方法
//网页上的每个元素还有scrollHeight和scrollWidth属性,指包含滚动条在内的该元素的视觉面积。
//那么,document对象的scrollHeight和scrollWidth属性就是网页的大小,意思就是滚动条滚过的所有长度和宽度。
//仿照getViewport()函数,可以写出getPagearea()函数。
function getPagearea(){
if (document.compatMode == "BackCompat"){
return {
width: document.body.scrollWidth,
height: document.body.scrollHeight
}
} else {
return {
width: document.documentElement.scrollWidth,
height: document.documentElement.scrollHeight
}
}
}
//但是,这个函数有一个问题。如果网页内容能够在浏览器窗口中全部显示,不出现滚动条,那么网页的clientWidth和scrollWidth应该相等。但是实际上,不同浏览器有不同的处理,这两个值未必相等。所以,我们需要取它们之中较大的那个值,因此要对getPagearea()函数进行改写。
function getPagearea(){
if (document.compatMode == "BackCompat"){
return {
width: Math.max(document.body.scrollWidth,
document.body.clientWidth),
height: Math.max(document.body.scrollHeight,
document.body.clientHeight)
}
} else {
return {
width: Math.max(document.documentElement.scrollWidth,
document.documentElement.clientWidth),
height: Math.max(document.documentElement.scrollHeight,
document.documentElement.clientHeight)
}
}
}
获取元素位置
引用 getBoundingClientRect() 方法
window.onload=function(){
var h1=document.getElementsByClassName('h2')[0]
// var X= h1.getBoundingClientRect().left;
//
// var Y =h1.getBoundingClientRect().top;
console.log(h1.getBoundingClientRect())
// alert(X)
//它返回一个对象,其中包含了left、right、top、bottom四个属性,分别对应了该元素的左上角和右下角相对于浏览器窗口(viewport)左上角的距离。
//
//所以,网页元素的相对位置就是
//
// var X= this.getBoundingClientRect().left;
//
// var Y =this.getBoundingClientRect().top;
//
//再加上滚动距离,就可以得到绝对位置
//
// var X= this.getBoundingClientRect().left+document.documentElement.scrollLeft;
//
// var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
}
javascript this 指向问题 http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html
this是 JavaScript 语言的一个关键字。
它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。
function test() {
this.x = 1;
}
上面代码中,函数test运行时,内部会自动有一个this对象可以使用。
那么,this的值是什么呢?
函数的不同使用场合,this有不同的值。总的来说,this就是函数运行时所在的环境对象。下面分四种情况,详细讨论this的用法。
情况一:纯粹的函数调用
这是函数的最通常用法,属于全局性调用,因此this就代表全局对象。请看下面这段代码,它的运行结果是1。
var x = 1;
function test() {
console.log(this.x);
}
test(); // 1
情况二:作为对象方法的调用
函数还可以作为某个对象的方法调用,这时this就指这个上级对象。
function test() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.m = test;
obj.m(); // 1
情况三 作为构造函数调用
所谓构造函数,就是通过这个函数,可以生成一个新对象。这时,this就指这个新对象。
function test() {
this.x = 1;
}
var obj = new test();
obj.x // 1
运行结果为1。为了表明这时this不是全局对象,我们对代码做一些改变:
var x = 2;
function test() {
this.x = 1;
}
var obj = new test();
x // 2
运行结果为2,表明全局变量x的值根本没变。
情况四 apply 调用
apply()是函数的一个方法,作用是改变函数的调用对象。它的第一个参数就表示改变后的调用这个函数的对象。因此,这时this指的就是这第一个参数。
var x = 0;
function test() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.m = test;
obj.m.apply() // 0
apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。
如果把最后一行代码修改为
obj.m.apply(obj); //1
运行结果就变成了1,证明了这时this代表的是对象obj。
网友评论