王羽彪 | 学习前端


  • 首页

  • 归档

  • 标签

闭包

发表于 2017-02-22

闭包

当函数执行的时候,就会形成一个私有作用域(栈内存),这个私有用域保护私有变量不受外界干扰,这种机制叫做闭包;

1
2
3
4
5
6
function fn(){
var num=10;
}
fn(); / /fn在执行的时候形成了一个私有作用域,
并且这个作用域把var num = 10;保护起来了,形
成了一个闭包=?闭包形成的前提条件得有函数执行

关于ws的惨痛教训'

发表于 2017-02-21

使用剪切板,误删内容,ws编辑历史记录可以恢复

  • 今天下午的时候,使用前剪切板的时候,操作失误将md里的用两天琐碎时间整理的内容删除了,而且用返回键(ctrl+z/ctrl+shift+z)都无法恢复了,终于找到了ws的编辑历史记录
    1
    右击文本内容区——》local history-->show history

预解释

发表于 2017-02-21

预解释

为何学习预解释:

  1. 报错的时候,为何会报错?
  2. 带var和不带var的区别?
  3. 代码应该写在什么地方?
  4. 当代码不一样的时候,弹出同样的i,结果却不同?

    undefined

  5. obj.xxx–>xxx属性下的值不存在的时候
  6. function的没有返回值的时候;
  7. 定义形参执行的时候没有传
  8. 在预解释的时刻,var声明的变量在赋值之前是undefined;

    全局变量和私有变量

  • 定义在script里的变量就是全局变量;定义在函数里的就是私有变量
  • 在函数外不可以读取函数内定义的私有变量,在函数内部是可以读取全局变量甚至修改
  • 尽量不要往全局变量存值

    全局作用域和私有作用域

  • 函数执行的时候形成一个私有作用域,
  • 全局作用域只要打开浏览器就已经产生,一般用window表示

    声明和定义

  • 概念:在当前作用域下,在JS代码执行之前,浏览器会对带var和带function的进行声明或定义;
  • 带var的:只声明不定义; var abc;
  • 带function声明过的函数:声明加定义
  • 如果函数名字和变量名字重名,在预解释阶段以最后一个函数为准,当代码执行到变量赋值的那一行,以这个变量为准

    关于函数

  • 函数定义三阶段:
    1. 开辟一个空间地址
    2. 把函数体中的所有JS代码作为字符串放在这个空间中
    3. 把空间地址赋值给函数名
  • 函数执行四阶段:

    1. 形成一个私有作用域
    2. 形参赋值
    3. 预解释:
    4. 代码从上到下的执行;
      1
      2
      3
      4
      5
      6
      7
      var n=123;
      function fn(){
      alert(n)
      n=456;
      alert(n)
      }
      fn(4);
  • 以上题涉及到的新知识点:

    1. 作用域链:当函数被调用的时候,形成一个私有作用域;我们找私有变量n;
      如果有私有变量n,那么整个函数中的n都是该函数的私有变量,跟外界没有任何关系;
      如果没有私有变量n,就到该函数的上级作用域进行查找,找不到,继续往上找,一直找到window,还没有的话:报错!
    2. 带var 和不带var 的区别:
      • 带var会进行预解释;在全局作用域下,他也是window的全局属性;
      • 不带var不会进行预解释;如果进行赋值的话,就是给window进行全局属性的赋值;window.xxx=xx;
    3. 私有变量有2种:1)形参 2)函数中带var的;
    4. 上级作用域:跟函数在哪里调用无关;只跟函数对应的堆内存在哪里开辟有关;

      内存和内存释放

  • 栈内存:形成一个供JS代码执行的环境:1)全局作用域 2)私有作用域

    • 全局作用域:当浏览器加载完页面的时候,全局作用域就形成了
      • 销毁:关闭页面
    • 私有作用域:一般当函数执行完成的时候,自己就销毁,有两种情况不销毁:

      • 不销毁:当函数里面的东西,被外面的变量或其他东西占用的时候,就不会销毁了

        • return被占用:当函数执行完成的时候,会返回一个引用数据类型的值,这个值销毁,所有的函数才能销毁;fn()();
        • 函数内的引用数据类型被同时赋予给函数外的变量;(如果不return出来,那么可以到函数里去占用它)
        • 在绑定时间的时候,也有可能和作用域不是释放掺和在一起
          1
          2
          3
          4
          5
          6
          Element.onlick= (function(){
          var count = 0;
          return function fn(){
          console.log(++count);
          }
          }())
      • 自执行函数也不不立即销毁:

  • 堆内存:他用来存放数据的;
    • 对象数据类型:存的是键值对
    • 函数数据类型:存的是代码字符串;
    • 堆内存的销毁:var obj={} var fn=xxxff00; 销毁方式=》obj=null; fn=null;

      预解释无节操:

  1. 只对等号左边带var,声明不定义
  2. 自执行函数不会进行预解释,只有执行到他的时候,声明+定义+调用同步完成
  3. 条件判断语句中无论条件是否成立都会进行预解释;–提醒我们:不要在条件判断语句中写函数的定义阶段
  4. return后面的语句不会进行预解释,return下面的语句虽然不执行,但会进行预解释
  5. 已经声明过的变量不会进行重复声明;

    运算符的优先级:算术》比较》逻辑》赋值 ; 所以一般用到赋值运算符的时候,都要加()提高优先级;

    ++i 先++,后运算; i++ 先运算再++; ++i也有强制转化为数字的默认行为

函数执行的过程

  1. 只要函数执行就需要浏览器提供一个私有作用域
  2. 形参赋值:形参相当于定义在当前函数体内的私有变量
  3. 先预解释当前函数体内带var和function的
  4. 代码从上往下执行

background

发表于 2017-02-19

background

1
2
3
4
5
整合写法:
backgroun: url("") no-repeat top right yellow;
background-size:;
background-clip:;
background-origin:;
  • background:
    • color
      • rgb
      • “#
      • rgba(0,0,0,0.2) a是透明度 取值范围在0-1
      • transparent 透明
      • inherit 继承父级元素
    • repeat
      • no-repeat
      • repeat-x
      • repeat -y
      • 默认值是 repeat
      • inherit
    • position
      • 水平
        • percentage | length | left | center | right
      • 垂直
        • percentage | length | top | center(图片的中心和盒子的中心重合) | bottom
    • url(“”)
      • 可以引入多张图片用 , 定位都为定位背景的x:0;y0;引入多个图片的方法ie8及以下不兼容;
    • size 大小
      • length x y (值auto将按照比例缩放)
      • percentage x y为百分比
      • cover 保持纵横百分比将图片缩放成完全覆盖定位区域的最大大小
      • contain; 保持纵横百分比将图片缩放成适合定位区域的最小大小
    • origin
      • position的起源位置
      • attachment属性为fixed的时候,该属性没有效果
    • attachment ??????
    • clip
      • border-box
      • padding-box
      • content-box
  1. 将多个小图片放在一个大的透明的图片文件中,调取时,同意调取这张图片,按照图片位置的定位来展现其中的一部分
    • 作用:减少http请求,优化代码

js基础

发表于 2017-02-19

数据类型

  1. 基本数据类型(值类型)__
  2. 引用数据类型:操作的是为空间地址
    • {}
    • []
    • RegExp正则表达式
    • function
  3. typeof的返回值
    • “boolean”
    • “number”
    • “string”
    • “null”—“object”
    • “undefined”
    • “function”

      常用的输出和输入方式

  4. document.write
  5. innerHTML –>能识别标签
  6. innerText –>不能识别标签

    字符串的方法

  7. 字符串:用引号包起来的字符,由一个个字符组成
  8. 空格也是字符
  9. length 字符的个数

    1
    2
    str.length 字符的个数
    str[index]
  10. 字符串的方法

    1. charAt 在字符串中,根据索引的位置查找指定的字符 将其返回
    2. charCodeAt 在字符串,根据索引位置返回相应的字符ASCII编码;每个汉字、字母,都有一个自己的UNICODE编码
    3. substr(n,,m) 从索引n开始截取到m处(不包括m),并返回被截取的字符 不改变原数组
    • substring(n,m)从索引n开始截取到m处(包括m)
      1
      substring支持负数,当m值为负数的时候,m就值得是length+的index
    1. 转换大小写
      • str.toUpperCase() 所有的小写转换为大写
      • str.toLowerCase() 所有的大写转为小写
    2. 将字符串转为数组 split(“分隔符”)
      分隔符-》逗号
      如果分隔符不存在,吧在整体作为数组的一项返回
    3. 字符串替换

      1
      replace(n,m) 用新的替换旧的
    4. 捕获

      1
      macth(字符)

      返回字符的详细信息[字符,索引,原字符串]

    5. 通过字符找索引,找不到返回-1

      1
      search(字符)
    6. trim 去除字符串首尾的空格

      1
      2
      trimLeft()
      trimRight()

Math方法

  1. Math.max 取最大值
  2. Math.min 取最小值
  3. Math.floor 向下取整
  4. Math.ceil 向上取整
  5. Math.abs 取绝对值,正数
  6. Math.round 四舍五入
  7. Math.pow(n,m) n的m次方
  8. Math.sqrt(n) 将n开平方
  9. Math.random() 去0到1之间的随机数
  10. 取n到m之间的随机整数
    1
    Math.round(Math.random()*(m-n)+n;

数组中的方法研究的时候主要看1.参数、2.返回值、3.改变或者不改变原数组

  1. 增加、修改、删除
    1. push() 向末尾增加内容
      • 向末尾增加的数,可为多个
      • 新增的后的length
      • 改变
    2. pop() 删除末尾项
      • 无
      • 被删除项
      • 改变
    3. shift()删除数组中的第一项
      • 无
      • 被删除项
      • 改变
    4. unshift() 想数组开头加一项
      • 增加项;
      • 新增后的length
      • 改变
    5. splice(n,m,x) 从索引n开始删除m个元素,并用x代替
      • 把删除的内容以一个新的数组返回
      • 改变原数组
      • splice(n,m)
      • splice(n)
      • splice(0) 可以用于6克隆数组
      • splice(n,0,m) 课用于向数组中增加项
  2. 数组的截取和拼接

    1. slice(n,m)
      • 从数组的索引n开始截取到索引m处(不包括m)
      • 返回值为:被找到的部分组成的新数组
      • 不改变元原来的数组
      • slice(n,m)
      • slice(n)
      • slice(0)/slice()
      • 当n或m的值是负数的时候,n=ary.length+n/m;
      • 当n>m时,返回空数组
    2. concat() 把两个数组拼接到一起,原来的数组不变
      1
      ary1.concat(ary2)
  3. 把数组转换为字符串

    1. toString();
      • 数组
      • 返回值为转化后的字符串
      • 不改变
    2. join(“分隔符”) 把数组中的每一项用分隔符拼接成一个字符串
      • 分隔符,如”+”
      • 拼接后的的字符串
      • 不改变
        1
        2
        3
        4
        eval:js中把字符串转换为表达式的一个方法
        eval("10+20+30")--->60
        把数组中的每一项进项相加求和
        eval(ary.join("+"));
  4. 数组的排序和排列

    1. reverse() 把数组倒过来排序
      • 数组
      • 转换后的数组
      • 改变原数组
    2. sort() 给数组进行排序–》只能处理10以内的数字进行排序,因为他是按照UNTCODE编码进行排列的
      • 数组
      • 排列后的数组
      • 改变
        1
        2
        3
        ary.sort(function(a,b)){return a-b);};
        由小到大排列
        b-a为由大到小排列
  5. 只有在标准浏览器中兼容的方法,在ie6-8不兼

    1. indexOf/lastIndexOf
      字符串中也有这两个方法;
      –》当前内容在数组中第一次/最后一次出现位置的索引,如果数组中没有这一项,返回的结果是-1,如果有这一项,索引是几就返回几,原来的数组不变
    2. forEach/map 都是用来遍历数组中的每一项的–》具体看黑皮笔记本
  6. 更多的数组方法
    1
    console.dir(Array.prototype);

Date

  1. new Date()
    获取当前自己电脑的时间;不能作为重要用途;例如淘宝秒杀等
  2. get Date
    1. time.getMonth()+1
      获取的是0-11月;0代表的即是我们所谓的一月
    2. time.getDate() 获取日期
    3. time.Day() 星期 , 0~6
    4. time.Hours() 小时
    5. time.Minutes() 分钟
    6. time.Seconds() 秒
    7. time.Milliseconds() 毫秒

保留字

发表于 2017-02-19

保留字

  1. 关键字
    • break
    • delete
    • function
    • return
    • typeof
    • case 情况
    • do
    • if
    • switch 转换,开关
    • var
    • catch 捕获
    • else
    • in
    • this
    • void 空
    • continue 继续,仍旧
    • false
    • instanceof
    • throw 投掷
    • while
    • debugger 调试器
    • finally
    • new
    • true
    • with
    • default
    • for
    • null
    • try
  2. 保留字
    • abstract 抽象的概念,梗概
    • double
    • goto
    • native 本地的
    • static 静态的
    • boolean
    • enum 枚举
    • implements 工具
    • package 包裹
    • super
    • byte
    • export 输出
    • import
    • private
    • synchronized 同步的
    • char
    • extends 继承
    • int 整
    • protected 受保护的,保护
    • throws
    • class
    • final
    • interface 界面,接口
    • public
    • transient 暂态,动态
    • const 常数
    • float
    • long
    • short
    • volatile 非易失

使用github

发表于 2017-01-19
  1. get是否安装成功:git –version
  2. git的配置

    1
    2
    git config --global user.name "github的用户名"
    git config --global user.email "git邮箱"
  3. git的工作流

    1. 先创建一个本地的git库:
      • 创建一个文件夹
      • 把文件夹变成自己可以管理的文件夹 `git init``
    2. 创建一个远程仓库:登录github官网;右上角有个+号来创建新的仓库
    3. 给本地仓库添加一个远程通道

      • 添加远程通过git remote add 通道名称

        1
        git remote add origin https://github.com/nanchengjiumeng/test01.git
      • 查看链接了哪些远程通道git remote -v

    4. 吧本地仓库的内容推送到远程仓库三部曲:
      1. git add . ; git add -A
        (点代表全部,这里只是在暂存区)
      2. git commit -m”
        这里是用来写注释的”(这里只是在历史区)
      3. git push origin master
        (把我本地的仓库的内容推送到origin这个远程仓库的master分支上去)
  4. 如何更新老师的讲义
    1. 把老师发送到群里的GitHub的远程地址,复制到GitHub的地址栏,回车;
    2. 到了老师的仓库后点击fork,叉到自己的远程仓库;
    3. fork之后就自动到了自己的远程仓库,复制地址,使用git clone地址:
      git clone https://github.com/nanchengjiumeng/Javascript201616.git
      • git clone 协议地址 自动的让本地仓库和自己的远程仓库,添加了联系
      • cd .. 返回上一级
      • cd document 进入某个文件
    4. 当老师讲义更新的时候,学生如果想更新自己的课件:
      1. 建立学生本地仓库跟老师远程仓库的联系
      2. git remote update teacher
      3. git pull teacher master
  5. 常用的命令
    • git 是否安装成功 git –version
    • 添加远程通道 git remote add xxx (origin:自己的远程 xxxx:别人的)
    • 查看本地连接了哪些远程 git remote -v
    • 删除远程通道 git remote rm xxxx
    • 把远程仓库的内容更新到本地
      1. git remote add teacher 添加远程通道
      2. git remote update teacher
      3. git pull teacher master
    • 吧本地仓库内容推送到自己远程仓库
      1. git add ./
      2. git commit -m”注释”
      3. git push origin master
    • ls 查看当前文件夹下有哪些子文件;(有的电脑是dir)
    • cd 文件夹名字 -> 进入某个文件夹
    • mkdir 文件夹 ->创建文件夹
    • touch 创建多个文件夹
    • 进入文件夹并创建问价可以合并: cd 文件夹名 && touch 文件.后缀 文件.后缀
  1. 删除文件夹的命令 删除文件的命令
  2. 一个远程文件夹对应一个本地文件夹
  3. 如何忽略文件
    • 新建.gitignore文本文件
    • 吧忽略掉的文件名字输入在.gitignore就可以,比如.idea等webstorm生成的文件

      关于this的总结

  4. 当元素身上的事件被触发的时候,会执行一个函数,函数中的this指向当前的元素;
  5. 函数名前的点前面的元素;
  6. 自执行函数的this永远只想window;

Pro Git

点击前往 Pro Git>>;

1…45
王羽彪

王羽彪

技术 | javascript | html | 前端学习

47 日志
77 标签
© 2017 王羽彪
由 Hexo 强力驱动
主题 - NexT.Pisces