美文网首页前端之路
2018-11-05(参考基础阮一峰大神记录)一

2018-11-05(参考基础阮一峰大神记录)一

作者: 冫笙 | 来源:发表于2018-11-05 12:46 被阅读14次

随笔以防止忘记

闭包

<!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。

相关文章

网友评论

    本文标题:2018-11-05(参考基础阮一峰大神记录)一

    本文链接:https://www.haomeiwen.com/subject/zuajxqtx.html