1. 其它语言是以代码块作为作用域的。下面程序会报错(如C,C++中),因为局部变量name只在{   }代码块中生效。打印console.writeline(name)中的name时就会报错。

  public void Func(string v) {

  if(1==1){

    string name='Jave';  

  }

  console.writeline(name);

  }

  Func( )  //报错

修改如下,才能正常运行:

  public void Func(string v) {

  if(1==1){

    string name='Jave';
console.writeline(name);      }     }   Func( ) //正常运行

2.Python:冒号+缩进作为一个代码块。在其它语言中是以代码块作为作用域的,在Python中是以函数作为作用域的。如下模块可以正常运行。

  def func():

    if 1==1:

      name='alex'

    print(name)

  func()

如下就会报错:

  def func():

    if 1==1:

      name='alex'

    print(name) 还在作用域范围内

  func() 

    print(name) 已经出了作用域,此处会报错。

3. Javascript:

1)Javascript 默认是以函数作为作用域的。(let关键字函数除外)。与Python一样。下列代码可以正常运行。

      

function func(){
if(1==1){var name="alex";}
console.log(name);
}
func()

2)函数的作用域在函数未被调用之前,就已经创建。当解释器去解释它或者编译它的时候,这个作用域就已经被创建了。尽管此时函数还未被调用。      

3)函数的作用域存在作用域链(函数里面套函数 or 作用域里面套作用域),并且也是在被调用之前创建。

执行结果是tony,先从内部找,找不到的话,一层一层往外找。

在浏览器中写代码的时候,有回车的话,需要shift+回车。否则立马就执行了。

a="alex"
function func(){
    var a="eric";
  function inner(){
      var a="tony";
      console.log(a);
}
inner()
}
func()

在JS中探讨一下如下代码,可以在浏览器中看执行结果,

a='alex';
function func(){
var a='eric';
function inner(){
console.log(a);
}
return inner;
}
var ret=func();
ret();

截图:

修改代码,继续探讨:此时的输出结果是Tony。

a='alex';
function func(){
var a='eric';
function inner(){
console.log(a);
}
var x="tony";
return inner;
}
var ret=func();
ret();

分析作用域:

4.) JS中,函数内部的局部变量会又一个提前声明的操作。

当一个变量根本就没有定义的时候,如果此时调用的话,程序会直接报错。

当一个变量声明了,但是没有赋值的时候,如果此时调用的话,程序会返回undefined。

在这里要注意,解释器解释的时候,遇到局部变量,会在内部执行一句 var xxoo的代码,相当于定义了一个xxoo的变量,只不过没有赋值。所以此时的返回结果是undefined,而不会报错。

function func()
console.log(xxoo);
var xxoo="alex";
func()
//undefined 执行结果返回undefined

如下代码,没有定义变量就直接引用,会报错。

function func()
console.log(xxoo);
func()
//报错

4. JavaScript也支持面向对象。

1)一般函数如下:

function foo(){
var xo="alex";
}
foo()

面向对象的函数:this相当于Python中的self。接下来不是调用函数,而是创建对象。对象前面都必须要加上new.

function Foo(n){
this.name="alex";
}
var obj=new Foo("we");
obj.name

A- this 代指当前调用它的那个对象(相当于Python中的 self)

B-创建对象时,new 函数()

再复杂一点,类里面可以定义字段(变量),也可以定义函数。

//创建了一个类
function Foo(n){
this.name="alex";
this.sayName=function(){
console.log(this.name)
}
}
//创建对象obj1
var obj1=new Foo("we");
obj1.name
obj1.saNname() //会执行那个函数
var obj2=new Foo("wee"); 
obj2.name
obj2.saNname() //会执行那个函数

JS中,调用几次,就会创建几次函数,这样太浪费空间。

在Python中,是把函数定义到类里面,只定义一次就可以了。

所以需要把函数放到一个公共调用区域。

#创建了一个类,也就是构造方法。
function Foo(n){
this.name=n;
}
#prototype是当前Foo的原型,Foo只创建一次,Foo的原型也就只创建一次。
Foo.prototype={
'sayName':function(){
console.log(this.name)
}
} obj1=new Foo('we');#此时obj1里面只封装了一个name
obj1.sayName() #通过obj1先找到Foo这个类,然后去类的原型里面再去找sayName函数。
obj2=new Foo('wee');
obj2.sayName()

图解:

类里面可以指向原型,当通过  对象.方法 执行类的时候,类会自动帮我们去原型里面找。

JS作用域-面向对象的更多相关文章

  1. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)

    一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...

  2. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  3. JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  4. JavaScript基础笔记(四) JS式面向对象

    JS式面向对象 一.理解对象 一)属性类型 ECMA-262 第 5 版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征. ECMA-262 定义这些特性是为 ...

  5. JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)

    一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...

  6. JS作用域面试题总结

    关于JS作用域问题,是面试的时候面试官乐此不疲的面试题,有时候确实是令人抓狂,今天看到一个讲解这个问题的视频,明白了那些所谓的“原理”顿时有种豁然开朗的感觉~~~ 1.js作用域(全局变量,局部变量) ...

  7. js作用域问题

    <script type="text/javascript"> alert(i);//Uncaught ReferenceError: i is not defined ...

  8. js 作用域

    js 作用域 js作用域链查找,子函数能取到父函数中定义的变量. 前段时间误写成如下形式: 这只是普通的函数调用,没有父子的关系,child()函数会在全局查找pi变量,没找到所以报错. 最近发现原来 ...

  9. 08.01 签到! js 作用域

    js 作用域 : 1.js 没有块作用域 : for (var i = 0;i < 4; i++){ } alert(i) // i = 3 2.js 没有动态作用域: function f1( ...

随机推荐

  1. [数据结构]_[C/C++]_[链表的最佳创建方式]

    场景 1.链表在C/C++里使用非常频繁, 因为它非常使用, 可作为天然的可变数组. push到末尾时对前面的链表项不影响. 反观C数组和std::vector, 一个是静态大小, 一个是增加多了会对 ...

  2. Spring源码分析——JdbcTemplate执行批量insert操作

    最近用到一个方法: @Override public int[] batchUpdate(String sql, final BatchPreparedStatementSetter pss) thr ...

  3. ASP.NET MVC 微信JS-SDK认证

    layout: post title: ASP.NET MVC 微信JS-SDK认证 category: .net date: 2016-11-01 00:00:00 tags: .net javas ...

  4. 在ubuntu trusty下安装python的rasterio库

    就这些吧.. apt-get update -y apt-get install -y software-properties-common add-apt-repository ppa:ubuntu ...

  5. 「日常训练」Ice Cave(Codeforces Round 301 Div.2 C)

    题意与分析(CodeForces 540C) 这题坑惨了我....我和一道经典的bfs题混淆了,这题比那题简单. 那题大概是这样的,一个冰塔,第一次踩某块会碎,第二次踩碎的会掉落.然后求可行解. 但是 ...

  6. 【springmvc+mybatis项目实战】杰信商贸-1.项目背景

    1.项目背景杰信项目物流行业的项目,杰信商贸是国际物流行业一家专门从事进出口玻璃器皿贸易的公司.公司总部位于十一个朝代的帝王之都西安,业务遍及欧美.随着公司不断发展壮大,旧的信息系统已无法满足公司的快 ...

  7. 四分树 (Quadtrees UVA - 297)

    题目描述: 原题:https://vjudge.net/problem/UVA-297 题目思路: 1.依旧是一波DFS建树 //矩阵实现 2.建树过程用1.0来填充表示像素 #include < ...

  8. SSH:远程登陆

    SSH用于计算机之间的加密登录的前提是公钥为真,所以存在中间人攻击中间人攻击:与https协议不同,SSH协议的公钥是没有CA公证的,当对公钥的请求被中间截获时,中间人可以发出伪造公钥干坏事而不被识破 ...

  9. Hexo 博客 之 腾讯云部署过程

    写在前面 Hexo 博客搭好了有差不多两周时间了,这期间走了很多弯路,跳了很多坑.一些坑自己 bing 到了答案,找到了解决方法,一些坑则是自己摸索出来的解决方法.现在准备写几篇关于搭建流程.搭建过程 ...

  10. Dask教程

    Dask 介绍 Dask是一款用于分析计算的灵活并行计算库. Dask由两部分组成: 针对计算优化的动态任务调度.这与Airflow,Luigi,Celery或Make类似,但针对交互式计算工作负载进 ...