一,声明对象

var obj1 = {};

var obj2 = {name:'kk',age:18,fun:function{          // name,age,fun为对象的属性,只是属性值不同

  console.log(123);

  return 1;

}};

console.log(obj2.fun)     //  获取的是对象属性,为 函数体
console.log(obj2.fun())   // 执行函数
 
——————————————————————————————————————————————————
二,声明函数
 
1, 直接量 :             function f1(){}
2, 表达式声明 :      var f2 = function(){}
3, 内置构造函数 :   var f3 = new Function(){}     // 构造函数首字母大写。  此函数声明方法很少用,了解即可
 
(一)function f1(){} 和 var f2 = function()  的 区别
1,直接量声明 有变量提升 。 声明前后都可以调用
2,表达式声明 也是有变量提升。但是赋值并没有被提升。   所以表达式声明 必须要在声明后才可以调用

(二)JavaScript 变量提升

1,JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。

JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。

2,JavaScript 只有声明的变量会提升,初始化的不会。

(三)函数在运行过程中一旦遇到 return 。就会结束执行

——————————————————————————————————————————————————


三,函数在 js 中的意义及作用

1,在 js 中,函数是一等公民

2,因为 在 js 中 , 函数是一个特殊的数据类型

3,数据类型在任何语言中都是一等公民

4,函数是一个值, 可以和字符串,数组,对象等数据类型 同等方式使用

function f1(v){
console.log(v)
}
var f2 = function(){
return 123;
}
 
f1(f2())
 
(一)将函数当作值使用的好处 
 
当做一个实参传到另一个函数里面时,形成了 回调函数
 
(二)回调函数  ( nodejs中大部分使用的就是回调函数 )
 
var a = 1
function f1(v){
  var a = 2
   f2()
}
 
function f2(){
      console.log(a)
}
 
f1(f2())
 
// f2被称作回调函数。 原因 : 函数自身的作用域在声明的地方,而不是在调用的地方
// 函数在哪声明,就在哪执行
// f2 的作用域是在全局下
// 虽然是在f1里调用的f2 。 但是 它需要出来找到 f2方法执行 。所以它是回调函数
// 它是在全局作用域里找 , var a = 2 是在局部作用域下 。 所以它找不到 var a = 2
 
(三) 闭包
var a = 1
function f1(f2) {
var a = 2
function f2() {
console.log(++a)
}
return f2
}
 
// 由于 f1 的运行结果是返回 f2
// 又因为 作用域链 和 函数自身作用域 的问题
// 导致 f1 运行结束后 不能销毁变量
// 因此形成了闭包
 
/*
    直接返回一个函数是最常见的一种闭包的形式
*/
 
var f = f1()
f()
f()
f()
f()
 
-----------------------------------------------------
 
// 先找到 f2() 声明的地方,然后再找 a
// 函数结束变量被销毁
// 作用域链 : 向上寻找
// 闭包
 
/*
形成的原因 :
 
当f1运行完后变量 a 会被销毁 。 但它发现后面的函数需要用到这个变量 。所以 js 解析引擎对于 f1里的 var a = 2
这个变量 不能销毁 。
为什么不能销毁 : 因为后面的 f2 函数需要用到这个变量
当 f1 函数一旦执行 , return 出去一个函数 。 此时就形成了一个闭包 。
f1 函数虽然执行完毕,但由于其执行过程中生成的那些变量和数据不能被销毁 。 所以这些数据就会常驻内存 。
 
此时 f2 函数一执行 。 它就会从刚刚 f1 执行后遗留的内存(或缓存)中 调用数据
个人理解 : 闭包就是把数据封闭起来 。 防止其销毁 。 后面还可以再内存中找到使用
 
*/
/*
   
闭包的两大作用和两大作用域 :
1,保留环境的作用域
2,外部和内部的桥梁
*/
 
 

2 —— js语法 —— 对象和方法的声明 。变量提升。闭包的更多相关文章

  1. 【JS学习】var let const声明变量的异同点

    [JS学习]var let const声明变量的异同点 前言: 本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 总述 ...

  2. JS:对象调方法1

    找调用者 1.如果有this,就先看this在哪个函数中,就是离this最近的function,没有就是window 2.找到函数后,辨别哪个是调用者 例1: 点击查看代码 function fn() ...

  3. js基础面试高频面点1:变量提升

    一.什么是变量提升?var变量提升的底层原理是什么? 变量提升的定义:所有变量的声明语句都会被提升到代码头部,这就是变量提升. 原理:引擎在读取js代码的过程中,分为两步,专业来说代码运行是分为预处理 ...

  4. JS逻辑题 技术点: 1). 变量提升 2). 函数提升 3). 预处理 4). 调用顺序

    考查的技术点:  1). 变量提升 2). 函数提升  3). 预处理  4). 调用顺序 var c = 1; function c(c) { console.log(c); var c = 3; ...

  5. js只对等号左边的进行变量提升

    ### 只对等号左边的进行变量提升 > =:赋值,左边是变量,右边都应该是值 ```javascript //之前 i%2 === 0?item.className = 'c1':item.cl ...

  6. js Math 对象的方法

    Math对象与JavaScript其他对象不同,因为用户不能生成所使用对象的副本,相反脚本汇集了简单Math对象的属性和方法.Math对象实际上存在于每个窗口和框架中,但是对脚本没有影响,程序员把这种 ...

  7. 关于js的对象创建方法(简单工厂模式,构造函数模式,原型模式,混合模式,动态模式)

    // 1.工厂方式创建对象:面向对象中的封装函数(内置对象) 简单来说就是封装后的代码,简单的工厂模式是很好理解的,关于它的作用,就是利用面向对象的方法,把一些对象封装,使一些占用空间多的,重复的代码 ...

  8. js selection对象使用方法

    IE:document.selection FireFox:window.getSelection() document.selection只有IE支持,window.getSelection()也只 ...

  9. JS打印对象的方法&将Object转换为String的函数

    1.有时候需要把对象中的字段属性打印出来,下面用JS实现输出对象: function writeObj(obj) { var description = ""; for (var ...

随机推荐

  1. Jsp和Servlet关系

    为什么会出现Jsp? 其实对于服务器来说它只认识Servlet,我们完全可以在Servlet用resp.getWriter().write("");画出网页的界面,但是仅仅一个很简 ...

  2. yum软件仓库常用命令

    一.PRM简化安装软件的复杂度 安装软件的命令格式 prm -ivh filename.rpm 升级软件的命令格式 prm -Uvh filename.rpm 卸载软件的命令格式 prm -e fil ...

  3. centos7搭建svn服务器及客户端设置

    centos7搭建svn服务器及客户端设置 centos7貌似预装了svn服务(有待确认),因此我们直接启动该服务即可 一.svn服务端配置(服务器IP假设为192.168.100.1) 步骤1:创建 ...

  4. 查漏补缺之go依赖管理

    vendor 使用vendor进行包管理,首先要保证项目在$GOPATH/src/路径下(踩过坑),然后build时就会按照如图所示的优先级进行包的搜索. 一个没有找到包的实例: module 其他 ...

  5. 一文解读SDN (转)

    一. 什么是SDN? SDN字面意思是软件定义网络,其试图摆脱硬件对网络架构的限制,这样便可以像升级.安装软件一样对网络进行修改,便于更多的APP(应用程序)能够快速部署到网络上. 如果把现有的网络看 ...

  6. 微信小程序中,如何实现显示,隐藏密码的功能

    最近在搞小程序的开发,遇到隐藏,显示密码的功能的时候,电脑上调试没问题,但是手机上面点击却没有效果,必须要跳转到其他页面再跳回来,才能正常显示. 一时间搞得我很头疼,查找资料后,终于知道了是什么原因. ...

  7. java并发初探ThreadPoolExecutor拒绝策略

    java并发初探ThreadPoolExecutor拒绝策略 ThreadPoolExecuter构造器 corePoolSize是核心线程池,就是常驻线程池数量: maximumPoolSize是最 ...

  8. Day3-F-Buy Low Sell High-CodeForces867E

    You can perfectly predict the price of a certain stock for the next N days. You would like to profit ...

  9. java中二进制反码补码的理解

    7句真言 1,二进制最高位是符号位 0正数 1负数 2,正数的原码,反码,补码都一样 3负数的原码反码 补码 (符号位不变,其他的位数取反 0->1 1->0) 4 0的反码补码都是0 5 ...

  10. Task使用注意

    1. CancellationTokenSource的使用 https://binary-studio.com/2015/10/23/task-cancellation-in-c-and-things ...