您的位置:时时app平台注册网站 > 编程知识 > Execution was interrupted【时时app平台注册网站】

Execution was interrupted【时时app平台注册网站】

2019-09-14 00:42

Execution was interrupted, reason: EXC_BREAKPOINT (code=1, subcode=0x101c2f740). The process has been returned to the state before expression evaluation.

全局作用域

 

 

最外层函数和最外层函数外面定义的变量:

var name="brizer";
function doSomething(){
    var realname="lf";
    function innerSay(){
        alert(realname);
    }
    innerSay();
}
document.write(name); //brizer
document.write(realname); //脚本错误
doSomething(); //lf
innerSay() //脚本错误

未定义直接赋值的变量:

/*全局作用域2:*/
function doSomething(){
    var name="brizer";
    realname="lf";
    document.write(name);
}
doSomething(); //brizer
document.write(realname); //lf

所有window对象:

一般情况下,所有window对象的内置属性都拥有全局作用域,如window.location等。

 

 

#import "TMUStoreMemoryDataCache.h"static TMUStoreMemoryDataCache * _instance = nil;@implementation TMUStoreMemoryDataCache  (instancetype)shareInstance{ //static TMUStoreMemoryDataCache * instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[TMUStoreMemoryDataCache alloc]init]; }); return _instance;}

深入理解javascript之作用域

简单地说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在javascript中,变量的作用域分为全局和局部两种。

拥有全局作用域就是在代码任何地方都能够访问到,叫做全局变量,以下三种情况可以拥有

 

 

  作用域的诞生,是因为当python在寻找一个变量的时候,首先会在当前的命名空间中寻找,如果当前命名空间中没有,就到上一级的命名空间中找,以此类推,如果最后都没找到,则触发变量没找到的异常。

还未找到具体原因

局部作用域

局部作用域只在固定的代码片段内可访问到。

如下代码:

function doSomething(){
    var name="lf";
    function innerSay(){
        alert(name);
    }
    innerSay();
}
alert(name); //脚本错误
innerSay(); //脚本错误
def wai_hanshu():
    a = []
    def nei_hanshu(canshu):
        a.append(canshu)
        return a

    return nei_hanshu

a = wai_hanshu()    # 我创建了一个对象
b = wai_hanshu()    # 我又创建了一个对象
print a
print b
print a(123)
print b(321)

将全局_instace换成局部的instace,就能解决

作用域链

下面我们说说作用域链,在javascript中,函数也是对象,实际上,javascript中的一切都是对象。函数内部有一个只给javascript引擎访问的内部属性是[[scope]],该属性包含了函数创建时的作用域中对象的集合,这个集合就叫做作用域链。

 

比如下面代码:

function add(num1,num2) {
    var sum = num1   num2;
    return sum;
}

在函数创建时,它的作用域链中会填入一个全局对象,该全局对象包含了所有全局变量,如下图:

时时app平台注册网站 1

 

当函数被执行时,会创建一个活动对象,该对象包含了函数所有局部变量、命名参数以及this,然后该对象会被推入作用域链的前端,当函数执行完毕,该对象也随之销毁。如下图:

时时app平台注册网站 2

 

可以看到,全局变量会被活动对象推到作用域链的最后端,这也就是为什么全局变量访问速度慢的原因!

 

  我们之前一直说:全局作用域无法访问局部作用域,而局部作用域能够访问全局作用域就这这个原因。而当我在局部作用域创建了一个和外面同名的变量时,python在找这个变量的时候首先会在当前作用域中找,找到了,就不继续往上一级找了。

我在一下代码中创建的单例,使用全局的static _instacce,就会出现以下错误,这个断点即使不打开All Exceptions`也会出现。后来我将上面全局的变量改成局部的,就不在出错。问题原因尚未找到

函数作用域

这里把函数作用域单独提出来讲并不是因为它和局部还有全局是平级关系,而是由于其比较特殊。JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。这是javascript权威指南中的一句话,相当经典。

举个例子说,

//函数运行在它们被定义的作用域里,而不是它们被执行的作用域
  var name = 'lf';
     function echo() {
          document.write(name);
     }

     function env() {
          var name = 'brizer';
          echo();
     }

     env();

最后结果的lf而不是brizer。说明函数在定义时,它的作用域就已经决定了。

  在早期的python版本时,局部作用域是不能访问其他的局部作用域的,只能访问全局的,而现在的版本都是依次向上一级找,这里就提一下。

with

 

一般情况下,作用域链只会被with和catch语句影响。当使创建用with的时候,函数会创建一个新的活动对象,推到最前端,该对象就是with的对象。这就意味着所有的局部变量都处于第二个作用域链对象中去了,这也就是为什么要避免使用with的原因。

function initUI(){
    with(document){
        var bd=body,
            links=getElementsByTagName("a"),
            i=0,
            len=links.length;
        while(i < len){
            update(links[i  ]);
        }
        getElementById("btnInit").onclick=function(){
            doSomething();
        };
    }
}

 

简单地说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在javascript中...

  注意:这里要做好对象之间的区分,例如:

  也就是因为这个特性,我们可以在内部函数中访问外部函数中的变量,这也就是所谓的闭包了。

 

时时app平台注册网站 3

  引入命名空间的主要原因还是为了避免变量冲突,因为python中的模块众多,模块中又有函数,类等,它们都要使用到变量。但如果每次都要注意不和其他变量名冲突,那就太麻烦了,开发人员应该专注于自己的问题,而不是考虑别人写的程序中用到了什么变量,所以python引入了命名空间。命名空间分为模块层,模块内又分为全局作用域和局部作用域,用一个图来表示的话:

装饰器

  其实装饰器就是在闭包的基础上多进行了几步,看代码:

def zsq(func):  # 装饰函数
    def nei():
        print '我在传入的函数执行之前做一些操作'
        func()  # 执行函数
        print '我在目标函数执行后再做一些事情'
    return nei

def login():    # 被装饰函数
    print '我进行了登录功能'

login = zsq(login)   # 我将被装饰的函数传入装饰函数中,并覆盖了原函数的入口

login()     # 此时执行的就是被装饰后的函数了

 

时时app平台注册网站 4

  在看这段代码的时候,要知道几件事:

  1.函数的参数传递的其实是引用,而不是值。

  2.函数名也是一个变量,所以可以重新赋值。

  3.赋值操作的时候,先执行等号右边的。

  只有明白了上面这些事之后,再结合一下代码,应该就能明白什么是装饰器了。所谓装饰器就是在闭包的基础上传递了一个函数,然后覆盖原来函数的执行入口,以后调用这个函数的时候,就可以额外实现一些功能了。装饰器的存在主要是为了不修改原函数的代码,也不修改其他调用这个函数的代码,就能实现功能的拓展。

  而python觉得让你每次都进行重命名操作实在太不方便,于是就给出了一个便利的写法:

def zsq(func):
    def nei():
        print '我在传入的函数执行之前做一些操作'
        func()  # 执行函数
        print '我在目标函数执行后再做一些事情'
    return nei

@zsq    # 自动将其下面的函数作为参数传到装饰函数中去
def login():
    print '我进行了登录功能'


login()

Execution was interrupted【时时app平台注册网站】。 

时时app平台注册网站 5  

  这些小便利也叫做python的语法糖,你可能在很多地方见过这个说法。

带参数的装饰器:

def zsq(a):
    print '我是装饰器的参数', a
    def nei(func):
        print '我在传入的函数执行之前做一些操作'
        func()  # 执行函数
        print '我在目标函数执行后再做一些事情'
    return nei


@zsq('123')
def login():
    print '我进行了登录功能'

 

 

时时app平台注册网站 6

  相当于: login = zsq(123)(login) ,所以在这里没有调用就执行了。

 

装饰器的嵌套:

  这里就不完整写个例子了:

@deco1(deco_arg) 
@deco2 
def func(): 
    pass

 

  相当于: func = deco1(deco_arg)(deco2(func))  

  也就是从上到下的嵌套了。


  关于闭包和装饰器就先讲到这里,以后有需要再补充。

 

  也许直接看定义并不太能明白,下面我们先来看一下什么叫做内部函数:

时时app平台注册网站 7

  模块之间命名空间不同,而里面还有全局作用域和局部作用域,局部作用域之前还能嵌套,这样就能保证变量名不冲突了。这里顺便补充一下,可以通过 __name__ 属性获取命名空间的名字:


  主文件的命名空间是叫做 '__main__',而模块的命名空间就是模块名。

 

  我在函数里面有嵌套了一个函数,当我向外层函数传递一变量的之后,并赋值给 a ,我们发现 a 变成了一个函数对象,而我再次为这个函数对象传参的时候,又获得了内部函数的返回值。我们知道,按照作用域的原则来说,我们在全局作用域是不能访问局部作用域的。但是,这里通过讨巧的方法访问到了内部函数。。

时时app平台注册网站 8

def wai_hanshu():
    a = []
    def nei_hanshu(canshu):
        a.append(canshu)
        return a

    return nei_hanshu

a = wai_hanshu()
print a(123)
print a(321)

  可以看出函数位于外部函数中的列表 a 竟然改变了。要知道为什么,就要先知道什么是python的命名空间,而命名空间就是作用域表现的原因,这里我简要说明一下。

 

  下面我们继续看一个例子:

时时app平台注册网站 9

  在这里,我们虽然都是操作 wai_hanshu 中的变量,但是 a 和 b 完全是两个对象,它们所在的内存空间也是不同的,所以里面的数据也是独立的。要注意不要搞混。

  python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。

def wai_hanshu(canshu_1):

    def nei_hanshu(canshu_2):  # 我在函数内部有定义了一个函数
        return canshu_1*canshu_2

    return nei_hanshu   # 我将内部函数返回出去

a = wai_hanshu(123)     # 此时 canshu_1 = 123
print a
print a(321)    # canshu_2 = 321

  以下说明主要针对 python2.7,其他版本可能存在差异。

时时app平台注册网站 10

本文由时时app平台注册网站发布于编程知识,转载请注明出处:Execution was interrupted【时时app平台注册网站】

关键词: