this为啥会为undefined?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了this为啥会为undefined?相关的知识,希望对你有一定的参考价值。

参考技术A

‘运行环境’也是对象, this 指向 运行时所在的对象 。
如下:

函数体内的 this 对象,就是 定义时所在的对象 ,而不是使用时所在的对象。

本来记住这几点已经可以了, this 最终找到是可能 window ,但是 undefined 是怎么又是怎么来的,本妹子下面将一步步分析。

综上所述,this指向运行时所在的对象或指向定义时所在的对象,但是这个对象可能最后找到是 window ,但都不可能是 undefined ,那么 undefined 是怎么来的呢?

我们一般写js文件都是 babel 转成 ES6 的, babel 会自动给js文件上加上严格模式。

用了严格模式 "use strict" , 严格模式下无法再意外创建全局变量 ,所以 this 不为 window 而为 undefined

严格模式为什么对箭头函数没有效果,返回还是 window ?

Given that this comes from the surrounding lexical context, strict mode rules with regard to this are ignored.

lexical means that this refers to the this value of a lexically enclosing function.

综上所述,在箭头函数中, this 为 lexical 类型, lexical 意味着这个 this 指是所在封闭函数中 this ,所以严格模式会自动忽视 use strict ,所以 this 如下所示:

箭头函数中, this 指向运行时所在的对象,而 use strict 被移到函数内了,所以 this 为全局变量 window 。

Happy coding ~~ ^ ^

为啥 django 1.7 会为字段选择的变化创建迁移?

【中文标题】为啥 django 1.7 会为字段选择的变化创建迁移?【英文标题】:Why does django 1.7 creates migrations for changes in field choices?为什么 django 1.7 会为字段选择的变化创建迁移? 【发布时间】:2014-11-26 23:00:36 【问题描述】:

我在 1.7 版中观察到了这种行为,但在使用南迁移的先前版本中没有。

例如。

class RedemptionCode(models.Model):
    EXPIRE_OPTIONS = (
        ('1 week', '1 Week'),
    )

    expire_option = models.CharField(max_length=255, choices=EXPIRE_OPTIONS)

当我添加更多选项时:

EXPIRE_OPTIONS = (
    ('1 week', '1 Week'),
    ('2 weeks', '2 Weeks'),
    ('1 month', '1 Month'),
    ('1 day', '1 Day'),
)

并运行makemigrations,它会为它创建一个迁移,来自south 背景我认为它应该说没有检测到更改,因为它不会影响数据库架构。我不知道它有什么用途:

class Migration(migrations.Migration):

    dependencies = [
        ('credits', '0001_initial'),
    ]

    operations = [
        migrations.AlterField(
            model_name='redemptioncode',
            name='expire_option',
            field=models.CharField(max_length=255, choices=[('1 week', '1 Week'), ('2 weeks', '2 Weeks'), ('1 month', '1 Month'), ('1 day', '1 Day')]),
        ),
    ]

【问题讨论】:

因为我得到了几个赞成票,在我看来这没有记录,因此我创建了一张票 code.djangoproject.com/ticket/23586 看看我对类似问题的回答***.com/a/29233569/3025188干杯! 对于其他任何人来说,这篇博文tech.yunojuno.com/pro-tip-django-choices-and-migrations 展示了一个很好的解决方案。 【参考方案1】:

在举票因重复而被关闭后,终于找到了答案:

这是设计使然。有几个原因,尤其是对我而言,历史上的数据迁移需要对模型进行完全准确的表示,包括它们的所有选项,而不仅仅是影响数据库的选项。

参考:

https://code.djangoproject.com/ticket/22837 https://code.djangoproject.com/ticket/23581

【讨论】:

【参考方案2】:

来自 Django 文档:

Django 将对模型或字段的任何更改进行迁移 - 甚至是不影响数据库的选项 - 因为它可以正确重建字段的唯一方法是拥有历史中的所有更改,并且您可能需要稍后在某些数据迁移中使用这些选项(例如,如果您设置了自定义验证器)。

参考:

https://docs.djangoproject.com/en/dev/topics/migrations/

【讨论】:

以上是关于this为啥会为undefined?的主要内容,如果未能解决你的问题,请参考以下文章

js打印网页table页头为啥有个undefined,怎么去掉这个undefined或者改过来

为啥数组的值是undefined

undefined; get exists(): boolean { return this.raw !== undefined; } decode(): Result

为啥 jquery ajax返回undefined

js问题 看看为啥总是弹出 undefined 我只是想吧所有数组浏览一遍

为啥此代码中的 console.log 返回 undefined?