首页 文章 精选 留言 我的

精选列表

搜索[SpringBoot4],共10000篇文章
优秀的个人博客,低调大师

编写高性能的Java代码需要注意的4个问题

一、并发 Unable to create new native thread …… 问题1:Java中创建一个线程消耗多少内存? 每个线程有独自的栈内存,共享堆内存 问题2:一台机器可以创建多少线程? CPU,内存,操作系统,JVM,应用服务器 我们编写一段示例代码,来验证下线程池与非线程池的区别: //线程池和非线程池的区别 public class ThreadPool { public static int times = 100;//100,1000,10000 public static ArrayBlockingQueue arrayWorkQueue = new ArrayBlockingQueue(1000); public static ExecutorService threadP

优秀的个人博客,低调大师

Nginx之4包罗万象 - (虚拟主机)

虚拟主机 目前除了大型网站是独占ECS之外(其实多数企业已微服务容器化、Serverless等..)为了提高服务器的利用率,都会在一台服务器上运行多个项目,但项目如何配置在Nginx上面可以同时运行呢? 以下分享如何实现这个功能。 功能配置 为了演示,提前将修改域名的解析记录到ECS上。然后在/data/webroot/project1 & project2 分别建立一个默认页 mkdir -p /data/webroot/project1 mkdir -p /data/webroot/project2 echo "HelloWorld! This is Project1" > /data/webroot/project1/index.html echo "HelloWorld! This is Project2" > /data/webroot/project2/index.html 不同端口,区分不同项目(经常用) server { listen 8081; server_name project.yekangming.com; location / { root /data/webroot/project1; index index.html; } } server { listen 8082; server_name project.yekangming.com; location / { root /data/webroot/project2; index index.html; } } 访问效果 不同域名,区分不同项目(经常用) server { listen 80; server_name project1.yekangming.com; location / { root /data/webroot/project1; index index.html; } } server { listen 80; server_name project2.yekangming.com; location / { root /data/webroot/project2; index index.html; } } 访问效果 不同IP,区分不同项目(很少用) server { listen 172.16.49.101:80; server_name localhost; location / { root /data/webroot/project1; index index.html; } } server { listen 172.16.49.102:80; server_name localhost; location / { root /data/webroot/project2; index index.html; } } 不同路径,区分不同项目(很少用) server { listen 80; server_name project.yekangming.com; location /project1 { root /data/webroot/project1; index index.html; } location /project2 { root /data/webroot/project2; index index.html; } } 配置详解 listen; #监听的端口,默认监听本地全部IP地址server_name;#监听的域名location; #请求的URI匹配,默认是/root;#本地文件系统的路径index; #默认页名称 小技巧 在维护多虚拟主机的配置时,不会将全部的站点写入同一个配置文件中,因为代码量太长维护性及可读性太差。一般会使用includebo包含另外一个配置文件夹专门用于存放虚拟主机站点的配置。配置方法很简单,在http段中加入include /usr/local/nginx/conf/extra/*.conf; 在Nginx重启时会读取这个文件夹中.conf为后缀名的配置文件。每一个站点单独维护一个配置文件,对Nginx配置出错时可以很快排查到哪一个站点哪一个配置的问题。而且对于脚本去生成配置到文件夹中很简便。

优秀的个人博客,低调大师

[雪峰磁针石博客]大数据Hadoop工具python教程4-mrjob

mrjob是由Yelp创建的Python MapReduce库,它封装了Hadoop流,允许MapReduce应用程序以更加Pythonic的方式编写。 mrjob用纯Python编写多步MapReduce作业。使用mrjob编写的MapReduce作业可以在本地测试,在Hadoop集群上运行,或使用Amazon Elastic MapReduce(EMR)在云中运行。 使用mrjob编写MapReduce应用程序有许多好处: mrjob目前是非常活跃的框架,每周都有多次提交。 mrjob拥有丰富的文档。 可以在不安装Hadoop的情况下执行和测试mrjob应用程序,在部署到Hadoop集群之前就可开发和测试。 mrjob允许MapReduce应用程序在单个类中编写,而不是为mapper和reducer编写单独的程序。 虽然mrjob是很好的解决方案,但它确实有它的缺点。 mrjob是简化的,因此它不会提供与其他API提供的Hadoop相同级别的访问权限。 mrjob不使用typedbytes,因此其他库可能更快。 安装 $ pip install mrjob 参考资料 python测试开发项目实战-目录 python工具书籍下载-持续更新 python 3.7极速入门教程 - 目录 原文地址 本文涉及的python测试开发库 谢谢点赞! [本文相关海量书籍下载](https://github.com/china-testing/python-api-tesing/blob/master/books.md 单词统计 #!/usr/bin/env python # 项目实战讨论QQ群630011153 144081101 # https://github.com/china-testing/python-api-tesing from mrjob.job import MRJob class MRWordCount(MRJob): def mapper(self, _, line): for word in line.split(): yield(word, 1) def reducer(self, word, counts): yield(word, sum(counts)) if __name__ == '__main__': MRWordCount.run() 执行结果 $ python word_count.py /home/hduser_/input2.txt No configs found; falling back on auto-configuration No configs specified for inline runner Running step 1 of 1... Creating temp directory /tmp/word_count.hduser_.20190122.035729.128110 job output is in /tmp/word_count.hduser_.20190122.035729.128110/output Streaming final output from /tmp/word_count.hduser_.20190122.035729.128110/output... "nimble" 1 "be" 2 "quick" 1 "jack" 2 Removing temp directory /tmp/word_count.hduser_.20190122.035729.128110... 比较重要的方法有:mapper()、combiner()和reducer()。 多个输入文件: $ python mr_job.py input1.txt input2.txt input3.txt 默认情况下,mrjob在本地运行,允许在提交到Hadoop集群之前开发和调试代码。要更改作业的运行方式,请指定-r/--runner选项。 $ python mr_job.py -r hadoop hdfs://input/input.txt $ python mr_job.py -r emr s3://input-bucket/input.txt

优秀的个人博客,低调大师

python最赚钱的4个方向,你最心动的是哪个?

身边有不少朋友最近都开始学习python,大多都在学了一两个月之后来问小编,我现在已经入行了,能去找什么样的工作呢?如果有对学python方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀。也希望大家对学python能够持之以恒 小编只能说:入行!=找工作那么,自学python的人,如何才能找到满意的工作呢?首先!合理制定学习计划,追踪学习进度!学习毕竟是个体力活,急于求成反而不美,不如按照这四个方向来制定自己的学习计划: 0.python语言基础:掌握python脚本python界面编程能力数据库基本爬虫多线程多进程开发能力。掌握以上技能,就能胜任基本的python开发工作。(平均月薪8k起)1.python web开发:掌握前端知识python三大后端框架具备独立开发网站的能力这些就是web全栈开发工作需要掌握的技能。(平均月薪10k左右)2.python爬虫:掌握python爬虫技术多线程爬虫技术分布式爬虫技术能够高效胜任爬虫工作。(平均月薪12k)3.python数据分析掌握python数据分析python数据可视化python机器学习、胜任数据分析和人工智能工作。(平均月薪能达到15k以上水平) 以上四种工作,你能胜任哪一个?又想要做到哪一个呢?

优秀的个人博客,低调大师

#自动化测试框架的4种有效分类与使用选择

前言 有人喜欢创造世界,他们做了开发者;有的人喜欢开发者,他们做了测试员。什么是软件测试?软件测试就是一场本该在用户面前发生的灾难提前在自己面前发生了,这会让他们生出一种救世主的感觉,拯救了用户,也就拯救者这个软件,避免了他们被卸载的命运。 自动化测试一直是敏捷开发和敏捷测试的重要基石,也是DevOps和CI/CD必不可少的组成部分。由于不同项目的测试需求不同,以及各种不同的限制,导致需要的自动化测试框架和工具也不同。比如很多金融和能源类的企业就倾向于选择收费的企业级自动化测试框架或者工具,而新型互联网企业则倾向于开源免费的自动化测试框架或者工具,或者基于它们进行二次定制开发,或者重新开发适合自己的自动化测试框架、工具或者平台。 之前一篇文章——《自动化测试框架Cucumber和RobotFramework的实战对比》仅仅针对两种自动化测试框架进行了讨论,却引发了大量的讨论,由此可见业界对于自动化测试框架存在很多不同的理解和争议。在我看来,没有任何一个自动化测试框架是银弹,并且适合所有类型的测试,所以“如何选择一款适合自己的测试框架”变成为了一个首要问题。我将自动化测试进行了简单的分层,见下图。 自动化测试架构分层图 其中测试库和被测系统紧密相关,所以可以选择的范围不是很大,也很难进行统一分类。而测试框架与被测系统关系并不紧密,而是和技术栈,开发流程与组织管理等关系紧密相关,并且种类繁多,可选择范围很多,所以选择也相对比较困难。 因此对测试框架进行统一分类可以更好的帮助团队选择适合自己的测试框架,从而更好进行自动化测试开发。 本文根据自动化测试用例的呈现方式和管理方式将其分为四种类型:函数型,单领域语言型,多领域语言型以及富文档型。 四个类型: 函数型 函数型自动化测试框架是第一代自动化测试框架,也是最轻量的测试框架。它只是通过函数的方式来定义测试用例,并且通过管理这些函数的调用来管理测试用例,从而快速的实现自动化测试,比如xUnit等。 例子JUnit: public class DemoTest { @Test public void testAddWithTwoNumbers() { //测试实现代码 } } 函数型自动化测试框架由来已久,开发快速,运行稳定。虽然它相对简单与轻量,但是也存在缺点:很难通过函数名来描述测试用例的内容和细节,并且不方便对测试用例进行单独管理,因为测试用例的描述函数名和测试实现通常都在一起。 单领域语言型 由于函数型的自动化测试框架很难通过函数名去描述一个测试用例的内容。为了更清晰和容易的描述测试用例,就出现了单DSL型的自动化测试框架,比如RSpec,Jasmine,Mocha等。 例子Jasmine: describe("The add function of the calculator can add two numbers", function() { it("should get the sum after add two numbers", function() { //测试实现代码 }); }); 单领域语言型可以通过自然语言或者关键字形式的领域语言来描述测试用例,从而以一种更加易读和理解的方式来描述测试用例。但是每个测试用例只用一句DSL语言,并不能很好的描述测试用例和被测场景,不易形成一套好的活文档。由于它的测试用例与测试实现通常也是在一起的,所以也不方便对测试用例进行单独管理。 如果对软件测试、接口测试、自动化测试、性能测试、LR脚本开发、面试经验交流。感兴趣可以175317069,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。 多领域语言型 由于单DSL型框架中对于每个测试用例只能使用一句DSL来描述,并不能很好的体现测试用例场景,比如测试的前提,行为和结果等。为了能在测试用例层更为清晰的描述测试用例的行为和测试数据等型信息,出现了多领域语言型的自动化测试框架,比如Cucumber,JBehave,SpecFlow,RF等。 例子Cucumber: 测试用例代码 Feature: The add function of the calculator can add two numbers Scenario: add two numbers Given there are two numbers <Number 1> and <Number 2> When add these two numbers Then should get <Sum> of two numbers Examples: | Number 1 | Number 2 | Sum | | 1 | 2 | 3 | | -1 | 2 | 1 | 测试实现代码 Given(/^there are two numbers$/) do //测试实现代码 end When(/^add two numbers together$/) do //测试实现代码 end Then(/^should get sum of two numbers$/) do //测试实现代码 end 多领域语言型的框架可以通过多句或者多个关键字的领域语言来描述一个特定的场景,使得测试用例更容易阅读和理解,并且比较容易做成一套活文档系统。由于测试用例和测试实现是分离的,还可以对测试用例进行独立管理。 但是缺点也是比较明显的,开发、管理和维护成本较高,并且如果没有业务分析或者产品人员等非技术人员参与协作开发,那么它的投入产出比就很低,大家往往会认为它是事倍功半。 富文档型 对于一些场景十分复杂,需要通过富文档的方式来描述软件测试场景,甚至需要一些业务流程图或者系统用户界面等,比如Concordion,Fitnesse,Guage等。 例子 Condordion: 测试用例代码,其中包含部分测试代码,比如断言等,其中concordion.css使用的是官方样例代码 <html xmlns:concordion="http://www.concordion.org/2007/concordion"> <link href="concordion.css" rel="stylesheet" type="text/css" /> <body> <h1>Test Demo</h1> <p> Test the add function of the calculator can add two numbers </p> <p> The Caculator:</p> <div> <img src="./Calculator.png"/> </div> <div concordion:example="add"> <h3>Examples</h3> <table> <tr> <th>Number 1</th> <th>Number 2</th> <th>Sum</th> </tr> <tr concordion:execute="#sum = addWithTwoNumbers(#number1,number2)"> <td concordion:set="#number1">1</td> <td concordion:set="#number2">2</td> <td concordion:assert-equals="#sum">3</td> </tr> <tr concordion:execute="#sum = addWithTwoNumbers(#number1,number2)"> <td concordion:set="#number1">-1</td> <td concordion:set="#number2">2</td> <td concordion:assert-equals="#sum">1</td> </tr> </table> </div> </body> </html> 测试用例呈现文档: 测试用例中的函数实现代码: @RunWith(ConcordionRunner.class) public class CaculatorFixture { public String addWithTwoNumbers(String number1, String number2) { //测试实现代码 } } (注:虽然说最新版的Concordion已经支持MarkDown了,从而降低了一些开发成本,但是其对MarkDown的特性支持有待增加。所以如果需要更为丰富的文档形式,仍然需要使用HTML来开发测试用例。) 富文档型的框架比多领域语言型拥有更为丰富的文档,更容易阅读和理解,从而能做成说明书式的活文档,使得所有角色的人都能审阅。并且其测试用例和测试实现也是分离的。但是当前业界存在的富文档型测试框架的易用性和协作性都还不是很好,导致其开发,管理和维护成本相比前三种是最高的。并且当没有其它各个角色来协同开发,管理和维护时,其投入产出比也是最低的,所以它在行业中的使用率也是很低的。这类测试框架在易用性和协作性方面还有很大的发展空间,并且也是自动化测试框架和活文档系统的一个重要的发展方向。 总结与选择 自动化测试的代码实现层一般是与编程语言强相关的,而主流的编程语言比较少,所以选择比较容易:一般建议选择团队大部分成员都熟悉的编程语言(这样可以促使整个团队来对自动化测试进行开发和维护)或者是有特定测试库的编程语言(比如需要使用Scapy时就只能选择基于Python的自动化测试框架)。当确认自动化测试开发语言后,真正的问题是如何在如此众多的自动化测试框架里面选择合适自己的自动化测试框架。选择方法可以根据以上四种类型来进行选择,从而缩小选择范围。 如果团队只是需要快速实现自动化测试,没有知识的传递问题,也不需要与业务分析和产品经历等非技术人员进行协作开发时,可以选择函数型自动化测试框架。 如果为了解决知识传递问题,让测试用例更可读和易懂,并且没有非技术人员参与协作开发,这时可以选择单领域语言型。 如果为了进一步解决和非技术人员协作开发的问题,并且想有一套简版的活文档,可以选择多领域语言型自动化测试框架。 如果为了让测试用例拥有更为丰富的表现力,比如包含一个流程图来说明被测场景的流程,或者使用不同的格式或者表格来描述用例的细节,以及拥有一套丰富的活文档,这时就可以使用富文档型。不过由于当前的富文档型测试框架在编写用例时需要一定的技能,所以非技术人员很难直接参与协作编写。并且其编写以及维护成本更高,可能使得自动化测试开发人员使用的意愿也不是很高。参考自动化测试工具选项金字塔: 当确认了测试框架类型之后,比如只有一个可选项(Java->函数型->JUnit),那么就直接使用了,但是如果存在多选项(JavaScript-> 单领域语言型->Jasmine vs Mocha),就还需要对其进行深入比较,从而最终选择自己适合的自动化测试框架。

优秀的个人博客,低调大师

深入理解 Java 虚拟机【4】HotSpot 垃圾收集器

HotSpot 虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,虽然我们要对各个收集器进行比较,但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。 新生代垃圾收集器Serial 垃圾收集器(单线程)只开启一条 GC 线程进行垃圾回收,并且在垃圾收集过程中停止一切用户线程(Stop The World)。 一般客户端应用所需内存较小,不会创建太多对象,而且堆内存不大,因此垃圾收集器回收时间短,即使在这段时间停止一切用户线程,也不会感觉明显卡顿。因此 Serial 垃圾收集器适合客户端使用。 由于 Serial 收集器只使用一条 GC 线程,避免了线程切换的开销,从而简单高效。 ParNew 垃圾收集器(多线程)ParNew 是 Serial 的多线程版本。由多条 GC 线程并行地进行垃圾清理。但清理过程依然需要 Stop The World。 ParNew 追求“低停顿时间”,与 Serial 唯一区别就是使用了多线程进行垃圾收集,在多 CPU 环境下性能比 Serial 会有一定程度的提升;但线程切换需要额外的开销,因此在单 CPU 环境中表现不如 Serial。 Parallel Scavenge 垃圾收集器(多线程)Parallel Scavenge 和 ParNew 一样,都是多线程、新生代垃圾收集器。但是两者有巨大的不同点:Parallel Scavenge:追求 CPU 吞吐量,能够在较短时间内完成指定任务,因此适合没有交互的后台计算。ParNew:追求降低用户停顿时间,适合交互式应用。 吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间) 追求高吞吐量,可以通过减少 GC 执行实际工作的时间,然而,仅仅偶尔运行 GC 意味着每当 GC 运行时将有许多工作要做,因为在此期间积累在堆中的对象数量很高。单个 GC 需要花更多的时间来完成,从而导致更高的暂停时间。而考虑到低暂停时间,最好频繁运行 GC 以便更快速完成,反过来又导致吞吐量下降。通过参数 -XX:GCTimeRadio 设置垃圾回收时间占总 CPU 时间的百分比。通过参数 -XX:MaxGCPauseMillis 设置垃圾处理过程最久停顿时间。通过命令 -XX:+UseAdaptiveSizePolicy 开启自适应策略。我们只要设置好堆的大小和 MaxGCPauseMillis 或 GCTimeRadio,收集器会自动调整新生代的大小、Eden 和 Survivor 的比例、对象进入老年代的年龄,以最大程度上接近我们设置的 MaxGCPauseMillis 或 GCTimeRadio。 老年代垃圾收集器Serial Old 垃圾收集器(单线程)Serial Old 收集器是 Serial 的老年代版本,都是单线程收集器,只启用一条 GC 线程,都适合客户端应用。它们唯一的区别就是:Serial Old 工作在老年代,使用“标记-整理”算法;Serial 工作在新生代,使用“复制”算法。 Parallel Old 垃圾收集器(多线程)Parallel Old 收集器是 Parallel Scavenge 的老年代版本,追求 CPU 吞吐量。 CMS 垃圾收集器CMS(Concurrent Mark Sweep,并发标记清除)收集器是以获取最短回收停顿时间为目标的收集器(追求低停顿),它在垃圾收集时使得用户线程和 GC 线程并发执行,因此在垃圾收集过程中用户也不会感到明显的卡顿。初始标记:Stop The World,仅使用一条初始标记线程对所有与 GC Roots 直接关联的对象进行标记。并发标记:使用多条标记线程,与用户线程并发执行。此过程进行可达性分析,标记出所有废弃对象。速度很慢。重新标记:Stop The World,使用多条标记线程并发执行,将刚才并发标记过程中新出现的废弃对象标记出来。并发清除:只使用一条 GC 线程,与用户线程并发执行,清除刚才标记的对象。这个过程非常耗时。 并发标记与并发清除过程耗时最长,且可以与用户线程一起工作,因此,总体上说,CMS 收集器的内存回收过程是与用户线程一起并发执行的。 CMS 的缺点:吞吐量低无法处理浮动垃圾,导致频繁 Full GC使用“标记-清除”算法产生碎片空间 对于产生碎片空间的问题,可以通过开启 -XX:+UseCMSCompactAtFullCollection,在每次 Full GC 完成后都会进行一次内存压缩整理,将零散在各处的对象整理到一块。设置参数 -XX:CMSFullGCsBeforeCompaction告诉 CMS,经过了 N 次 Full GC 之后再进行一次内存整理。 G1 通用垃圾收集器G1 是一款面向服务端应用的垃圾收集器,它没有新生代和老年代的概念,而是将堆划分为一块块独立的 Region。当要进行垃圾收集时,首先估计每个 Region 中垃圾的数量,每次都从垃圾回收价值最大的 Region 开始回收,因此可以获得最大的回收效率。 从整体上看, G1 是基于“标记-整理”算法实现的收集器,从局部(两个 Region 之间)上看是基于“复制”算法实现的,这意味着运行期间不会产生内存空间碎片。 这里抛个问题一个对象和它内部所引用的对象可能不在同一个 Region 中,那么当垃圾回收时,是否需要扫描整个堆内存才能完整地进行一次可达性分析? 并不!每个 Region 都有一个 Remembered Set,用于记录本区域中所有对象引用的对象所在的区域,进行可达性分析时,只要在 GC Roots 中再加上 Remembered Set 即可防止对整个堆内存进行遍历。 如果不计算维护 Remembered Set 的操作,G1 收集器的工作过程分为以下几个步骤:初始标记:Stop The World,仅使用一条初始标记线程对所有与 GC Roots 直接关联的对象进行标记。并发标记:使用一条标记线程与用户线程并发执行。此过程进行可达性分析,速度很慢。最终标记:Stop The World,使用多条标记线程并发执行。筛选回收:回收废弃对象,此时也要 Stop The World,并使用多条筛选回收线程并发执行。 原文发布时间为:2018-07-20本文作者:杨立滨本文来自云栖社区合作伙伴“ Java知音”,了解相关信息可以关注“ Java知音”

优秀的个人博客,低调大师

javascript成神之路(4):深入理解this关键字,是的就是this

摘要:如果你真的理解了this是什么,那么你的web几乎所向披靡(文章后面有惊喜,不要错过) 很多程序员会这么认为,this关键字与面向对象程序开发紧密相关,其完全指向由构造器新创建的对象。在ECMAScript规范中也是这样实现的,但正如我们将看到那样,在ECMAScript中,this并不限于只用来指向新创建的对象。还有很多新功能特性 一、定义 this代表当前对象,说明this是在某种特定的情况下才是成立的,它是执行上下文的一个属性。 activeExecutionContext = { AEC: {...}, this: thisVal }; 这里AEC是我们讨论的变量对象。this与上下文中可执行代码的类型有直接关系,this值在进入上下文时确定,并且在上下文运行期间永久不变。 二、全局代码中的this 在全局代码中,this始终是全局对象本身,这样就有可能间接的引用到它了。 // 显示定义全局对象的属性 this.ab = 10; // global.ab = 10 alert(ab); // 10 // 通过赋值给一个无标示符隐式 bb = 20; alert(this.bb); // 20 // 也是通过变量声明隐式声明的 // 因为全局上下文的变量对象是全局对象自身 var cc = 30; alert(this.cc); // 30 三、函数代码中的this 在这时候this值的首要特点是它不是静态的绑定到一个函数。this是进入上下文时确定,在一个函数代码中,这个值在每一次完全不同,但是在代码运行时的this值是不变的,也就是说,因为它不是一个变量,就不可能为其分配一个新值。 var F = {y: 10}; var Bar = { y: 20, test: function () { alert(this === Bar); // true alert(this.y); // 20 this = F; // 错误,任何时候不能改变this的值 alert(this.y); // 如果不出错的话,应该是10,而不是20 } }; // 在进入上下文的时候 // this被当成Bar对象 B.test(); // true, 20 F.test = Bar.test; // 不过,这里this依然不会是foo // 尽管调用的是相同的function F.test(); // false, 10 在我们通常的函数调用中,this是由激活上下文代码的调用者来提供的,即调用函数的父上下文(parent context )。this取决于调用函数的方式,正是调用函数的方式影响了调用的上下文中的this值,没有别的什么可以看到,即使是正常的全局函数也会被调用方式的不同形式激活,这些不同的调用方式导致了不同的this值。例如: function F() { alert(this); } F(); // global alert(F === F.prototype.constructor); // true // 但是同一个function的不同的调用表达式,this是不同的 F.prototype.constructor(); // F.prototype 那么,调用函数的方式如何影响this值?请看下面 四、引用类型 引用类型的值只有两种情况: 1、当我们处理一个标示符时,2、或者一个属性访问器 在一个函数上下文中,this由调用者提供,由调用函数的方式来决定。如果调用括号()的左边是引用类型的值,this将设为引用类型值的base对象(base object),在其他情况下(与引用类型不同的任何其它属性),这个值为null。不过,实际不存在this的值为null的情况,因为当this的值为null的时候,其值会被隐式转换为全局对象,例如: function F() { return this; } F(); // global 我们看到在调用括号的左边是一个引用类型值(因为F是一个标示符) var fooReference = { base: global, propertyName: 'foo' }; 相应地,this也设置为引用类型的base对象。即全局对象 var F = { B: function () { return this; } }; F.B(); // F 我们再次拥有一个引用类型,其base是F对象,在函数B激活时用作this。 var FB = { base: F, propertyName: 'B' }; 五、作为构造器调用的函数中的this 还有一个与this值相关的情况是在函数的上下文中,这是一个构造函数的调用。 unction A() { alert(this); // "a"对象下创建一个新属性 this.x = 10; } var a = new A(); alert(a.x); // 10 new运算符调用“A”函数的内部的[[Construct]] 方法,接着,在对象创建后,调用内部的[[Call]] 方法。 所有相同的函数“A”都将this的值设置为新创建的对象。 六、函数调用中手动设置this 在函数原型中定义的两个方法允许去手动设置函数调用的this值。它们是.apply和.call方法。他们用接受的第一个参数作为this值,this 在调用的作用域中使用。这两个方法的区别很小,对于.apply,第二个参数必须是数组(或者是类似数组的对象,如arguments,反过来,.call能接受任何参数。两个方法必须的参数是第一个——this。 var dog = { say() { console.log(this) } } var cat = {} dog.say.call(cat) 其中this通过call被绑定到了cat上 七、箭头函数 它的this指向与普通函数有很大的不同。箭头函数内部的 this 是词法作用域,由上下文确定。简单说就是箭头函数中的 this 只和定义它时候的作用域的 this 有关,而与在哪里以及如何调用它无关,同时它的 this 指向是不可改变的。 var obj = { x: 10, foo: function() { var fn = () => { return () => { return () => { console.log(this); //Object {x: 10} console.log(this.x); //10 } } } fn()()(); } } obj.foo(); 对于箭头函数还需要注意一点,就是它的this确定后不会改变。使用call、apply、bind也无法改变它的this,因此使用它们传入的第一个参数无效。但是后面添加的参数值还是有效的。 原文发布时间:2018年01月10日 作者:技术金三胖 本文来源:开源中国如需转载请联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册