JavaScript设计一个外部调用的函数

设计一个可以在外部调用的方法,方法中有回调函数,且回调函数能获取到需要的值

现在有一个编辑器插件(自已封装的),编辑器上有一个保存的按钮,当点击此按钮,会执行一个方法,这个方法中有回调函数,回调函数的参数为编辑器中的文本内容。我应该怎么做?


        // 编辑器内容的方法
      var editorPlugns = {
            saveBackFn: null;
        };
        editor.save = function() {
            // 保存编辑器自己要做的业务处理

        }

    // 在外部的回调方法,即外面需要做的事情
    editorPlugns.saveBackFn = function(data) {
        console.log(data);  // 此处为回调函数返回过来的编辑器中的文本内容
    }

编辑器只是作了一个文本编辑的作用,但是由于里面的功能也蛮多的,又不想影响插拔式使用,所以思路是想把具体要做用编辑器的模块上做具体的业务,而编辑器只是作为编辑的界面功能,不做任何业务上的处理。

1个回答

alibeibei
阿狸贝贝 这个问题我已经处理掉了,不是按你说的这种方法,不过还是谢谢你,那么晚还在帮忙我
大约一个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
使用wfs.js时不能调用其内部Websocket关闭和初始化函数,如何在外部调用?
由于项目要进行H.264裸流播放,在github上找到了可用的 [wfs.js](https://github.com/ChihChengYang/wfs.js "wfs.js"),最近又遇到了一个问题,无法调用wfs.js内部Websocket初始化和关闭的函数。 之前经过提问已经解决了 [调用函数内部函数](https://ask.csdn.net/questions/891402 "")的问题,答案中的链接地址是https://blog.csdn.net/weixin_43694639/article/details/88723280, 但是我用同样的写法,却不能调用websocket的关闭函数,只能调用发送数据的函数。 --- 这是整个函数折叠起来的样子: ``` (function(f)){... })(function() {... }); ``` 这是我要调用的函数整体: ``` var WebsocketLoader = function(_EventHandler){ _inherits(WebsocketLoader, _EventHandler); function WebsocketLoader(wfs){... } _createClass(WebsocketLoader, [{... //要调用的函数在省略号里 }]); return WebsocketLoader; }(_eventHandler2.default); exports.default = WebsocketLoader; ``` **不能调用**的函数,初始化websocket: ``` key: 'initSocketClient', value: function initSocketClient() { this.client.binaryType = 'arraybuffer'; this.client.onmessage = this.receiveSocketMessage.bind(this); // clientSocket.binaryType = 'arraybuffer'; // clientSocket.onmessage = socketReceive; this.wfs.trigger(_events2.default.WEBSOCKET_MESSAGE_SENDING, { commandType: "open", channelName: this.channelName, commandValue: "NA" }); //不知道这个trigger是什么 console.log('Websocket Open!'); flagSP = true; //initSocket = initSocketClient ``` **不能调用**的函数,主动关闭websocket: ``` //这个函数是我后来自己加的 key: 'onWebsocketClose', value: function onWebsocketClose(i) { clientSocket.send(i) console.log('切换页面,中断连接。' + i) clientSocket.close(); socketClose = onWebsocketClose; ``` **每次调用都会报这个错**: ``` [Vue warn]: Error in v-on handler: "TypeError: Object(...) is not a function" found in ---> <WindowFrame> at src/components/WindowFrame.vue <ElHeader> at packages/header/src/main.vue <ElContainer> at packages/container/src/main.vue <Ccqg> at src/components/main.vue <App> at src/App.vue <Root> vue.esm.js:628 TypeError: "Object(...) is not a function" showMain WindowFrame.vue:309 click WindowFrame.vue:268 VueJS 3 ``` 但是这个函数可以在外部调用: ``` key: 'onWebsocketMessageSending', value: function onWebsocketMessageSending(i) { clientSocket.send(i) console.log('发送视频请求:' + i) //this.client.send(i) //this.client.send(JSON.stringify({ type: 2, carNum: 8888 })) sendMsg = onWebsocketMessageSending ``` 我之前写过单独的websocket,可以直接在外部调用我定义的所有方法,包括初始化和关闭。不明白为什么这里不行。
(Vue/wfs.js)为什么不能调用wfs.js里的websocket初始化和关闭函数,只能调用发送函数?
由于项目要进行H.264裸流播放,在github上找到了可用的[wfs.js](https://github.com/ChihChengYang/wfs.js "wfs.js"),最近又遇到了一个问题,无法调用wfs.js内部Websocket初始化和关闭的函数。 之前经过提问已经解决了[调用函数内部函数](https://ask.csdn.net/questions/891402 "")的问题,答案中的链接地址是https://blog.csdn.net/weixin_43694639/article/details/88723280, 但是我用同样的写法,却不能调用websocket的关闭函数,只能调用发送数据的函数。 --- 这是整个函数折叠起来的样子: ``` (function(f)){... })(function() {... }); ``` 这是我要调用的函数整体: ``` var WebsocketLoader = function(_EventHandler){ _inherits(WebsocketLoader, _EventHandler); function WebsocketLoader(wfs){... } _createClass(WebsocketLoader, [{... //要调用的函数在省略号里 }]); return WebsocketLoader; }(_eventHandler2.default); exports.default = WebsocketLoader; ``` **不能调用**的函数,初始化websocket: ``` key: 'initSocketClient', value: function initSocketClient() { this.client.binaryType = 'arraybuffer'; this.client.onmessage = this.receiveSocketMessage.bind(this); // clientSocket.binaryType = 'arraybuffer'; // clientSocket.onmessage = socketReceive; this.wfs.trigger(_events2.default.WEBSOCKET_MESSAGE_SENDING, { commandType: "open", channelName: this.channelName, commandValue: "NA" }); //不知道这个trigger是什么 console.log('Websocket Open!'); flagSP = true; //initSocket = initSocketClient ``` **不能调用**的函数,主动关闭websocket: ``` //这个函数是我后来自己加的 key: 'onWebsocketClose', value: function onWebsocketClose(i) { clientSocket.send(i) console.log('切换页面,中断连接。' + i) clientSocket.close(); socketClose = onWebsocketClose; ``` **每次调用都会报这个错**: ``` [Vue warn]: Error in v-on handler: "TypeError: Object(...) is not a function" found in ---> <WindowFrame> at src/components/WindowFrame.vue <ElHeader> at packages/header/src/main.vue <ElContainer> at packages/container/src/main.vue <Ccqg> at src/components/main.vue <App> at src/App.vue <Root> vue.esm.js:628 TypeError: "Object(...) is not a function" showMain WindowFrame.vue:309 click WindowFrame.vue:268 VueJS 3 ``` 但是这个函数可以在外部调用: ``` key: 'onWebsocketMessageSending', value: function onWebsocketMessageSending(i) { clientSocket.send(i) console.log('发送视频请求:' + i) //this.client.send(i) //this.client.send(JSON.stringify({ type: 2, carNum: 8888 })) sendMsg = onWebsocketMessageSending ``` 我之前写过单独的websocket,可以直接在外部调用我定义的所有方法,包括初始化和关闭。不明白为什么这里不行。
JavaScript中如何才能在外部访问到立即执行匿名函数中的变量和函数?
立即执行匿名函数中的变量和函数怎么访问? ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576075596_800407.png) ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576075646_429739.png) 如何才能在外部调用fn1()函数和fn2()函数 如何才能在外部访问到age变量 ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576075808_537439.png) ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576075820_884404.png) [这是我的原贴](https://blog.csdn.net/czh500/article/details/103501049 "原贴地址") ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JavaScript中立即执行的匿名函数</title> <script type="text/javascript"> var hometown = '江西省赣州市于都县'; console.log(hometown); (function (){ console.log('我是一个匿名函数' + hometown); })(); (function (){ var age = 24; console.log('hello,我是一个匿名函数'); function fn1(){ console.log('我是fn1函数'); } fn1(); function fn2(){ console.log('我是fn2函数'); } fn2(); })(); //涉及到闭包的知识 //立即执行匿名函数中的变量和函数怎么访问? //如何才能在外部调用fn1()函数和fn2()函数 fn1(); //报错Uncaught ReferenceError: fn1 is not defined // fn2(); //如何才能在外部访问到age变量 // console.log(age); //报错Uncaught ReferenceError: age is not defined </script> <script type="text/javascript"> console.log('我的家乡在' + hometown); </script> </head> <body style="background-color: #CCE8CF;"> <h3 style="color: #cd1636;"> JavaScript中立即执行的匿名函数 </h3> </body> </html> ```
jquery 函数调用
对于jquery和javascript之间的函数调用有点疑问: 我写这样一个jquery代码: [code="js"] $(document).ready(function() { function clickToPage() { var options = { ... success: clickToPageResponse, ... }; $.ajax(options); } function clickToPageResponse(data) {...} }); // jquery的$(document).ready(function(){}函数外部 function deleteFunction(id) { var options = { ... success: deleteFunctionResponse, ... }; $.ajax(options); } function deleteFunctionResponse(result) { var options = { ... success: clickToPageResponse, ... }; $.ajax(options); } [/code] 问题出来了,deleteFunctionResponse中怎么都呼出不到clickToPageResponse,我估计是因为deleteFunctionResponse在$(document).ready(function(){}外部,而clickToPageResponse在内部的原因,请问有没有办法让$(document).ready(function(){}外部的javascript代码调到内部的jquery函数? 我不是很明白在$(document).ready(function(){}内外的具体区别,感觉上内部应该是jquery的代码,外部的话就是javascript,而且为什么在jsp标签中用onclick属性调用的函数只能写在$(document).ready(function(){}外部,写在内部就是调不到,只能用.click()来加载onclick函数?
各位大神看这里,有个关于js调用外部文件的小问题,请帮忙解答一下,谢谢!
场景如下: 一个项目中,有两个html页面需要tab选项卡,效果不同,html中使用相似的结构和类名(类名可能会重复),我现在将函数写在js文件中,然后再html中添加参数调用,有没有什么办法不需要在html中调用,让js文件的函数直接运行,由于类名可能会重复,如果在外部文件直接运行两次,可能会干扰正常的效果,请问各位大神在写js效果的时候,都是怎么在外部调用的。
js,在函数外部给函数添加一个属性,这个工作原理是怎样的
比如以下代码 ``` <script> function foo(num) { console.log( "foo: " + num ); console.log( window.abc ); // 记录 foo 被调用的次数 this.abc++; } foo.abc = 2; var i; for (i=0; i<10; i++) { if (i > 7) { foo( i ); } } //foo: 8 //undefined //foo: 9 //NaN //2 //NaN console.log( foo.abc ); // 2 -- WTF? console.log( abc ); // NaN -- WTF? </script> ``` 为什么我在函数外部给函数定义一个属性的时候,也会把这个属性定义到函数上级作用域(window)下面呢?而且,为什么,第一次打印的时候,window下面的abc属性是undefined,从第二次开始就成了NaN?
react 调用函数组件内部方法
react刚入门,学习element-ui carousel源码后,准备做一个轮播图,在react16.8之后推荐使用hook编写,现在父组件在调用子组件方法遇到了问题,源码使用class组件,我用函数组件,大概思意思是在CarouselItem 组件 componentWillMount时,向Carousel组件中items(Array)添加CarouselItem,之后再调用 CarouselItem组件中 translateItem方法;在class组件中 直接通过"."得方式就能访问到,在函数组件中显然是不行的(违反hook使用原则:不能再循环中使用,只能在函数组件的主体内部调用);求助有没有办法或者其他好的方案 ![图片说明](https://img-ask.csdn.net/upload/201905/05/1557071868_556156.png)![源码中调用](https://img-ask.csdn.net/upload/201905/05/1557071883_191437.png)![外部调用](https://img-ask.csdn.net/upload/201905/06/1557072038_911028.png)
javascript 函数调用问题
请看我的代码: function ess() { var title; $.ajax( { type :"POST", url :"REQ_title.php", success : function(obj) { title=obj; //alert(title); } }) alert(title); } 这段代码无法获取obj的值,请教各位高人我如何能在success : function(obj)的外部获取obj的值,先谢谢各位了
包含静态库的c++扩展node.js,编译时出错
具体问题为: node.js项目需要调用一个c++的函数,这个函数没有源文件,是通过调用lib文件的, 用c++写了一个简单的测试,调用这个函数是没问题的,但把lib文件,c++代码放在node 的扩展项目中,编译时出错:“无法解析的外部符号......”,请各位大神帮帮忙,十分感谢!
JavaScript 函数语法报错
这是一个外部类,功能是调用摄像头拍照 ``` package com.sy; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import com.github.sarxos.webcam.Webcam; import com.github.sarxos.webcam.WebcamPanel; import com.github.sarxos.webcam.WebcamResolution; import com.github.sarxos.webcam.WebcamUtils; import com.github.sarxos.webcam.util.ImageUtils; public class CaptureDemo { static Date day=new Date(); static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); public static void main(String[] args) throws IOException{ final Webcam webcam = Webcam.getDefault(); webcam.setViewSize(WebcamResolution.VGA.getSize()); WebcamPanel panel = new WebcamPanel(webcam); panel.setFPSDisplayed(true); panel.setDisplayDebugInfo(true); panel.setImageSizeDisplayed(true); panel.setMirrored(true); final JFrame window = new JFrame("摄像头"); window.addWindowListener(new WindowAdapter() { public void windowClosed(WindowEvent e){ webcam.close(); window.dispose(); } }); final JButton button = new JButton("拍照"); window.add(panel,BorderLayout.CENTER); window.add(button, BorderLayout.SOUTH); window.setResizable(true); window.pack(); window.setVisible(true); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { button.setEnabled(false); String fileName = "D://" + df.format(day); WebcamUtils.capture(webcam, fileName,ImageUtils.FORMAT_PNG); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(null, "拍照成功"); button.setEnabled(true); return; } }); } }); } } ``` 我现在想在jsp页面里写一个按钮,通过点击按钮触发这个类的方法,求具体代码写法。
请问如何用vb6.0调用网页代码,html语言和function函数啊
由于特效问题,我需要利用vb6.0的webbrowser控件加载网上下载的网页特效代码,举个栗子:(我如何将这个代码写进vb语言中并且能将图片地址转换成从外部读取的) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>超酷超绚精美图片展示效果代码(五) - 网页特效观止-网页特效代码|JsCode.CN|</title> <meta http-equiv="imagetoolbar" content="no"> <style type="text/css"> html { overflow: hidden; } body { margin: 0px; padding: 0px; background: #000; position: absolute; width: 100%; height: 100%; cursor: crosshair; } #box { position: absolute; background: #111; border: gray solid 1px; visibility: hidden; } #screen { position: absolute; left: 0px; width: 100%; top: 10%; height: 80%; background: #000; border: gray solid 1px; } #box img { position: absolute; border: gray solid 1px; cursor: pointer; } #box span { position: absolute; color: #ccc; font-family: verdana; font-size: 12px; width: 200px; } #box a { text-decoration: none; color:#ff8000; } #box a:hover { text-decoration: none; background:#ff8000; color:#ffffff; } #box a:visited { text-decoration: none; color:#ff8000; } #box a:visited:hover { text-decoration: none; background:#ff8000; color:#ffffff; } #lnk { visibility: hidden; } </style> <script type="text/javascript"> document.onselectstart = new Function("return false"); O = new Array(); box = 0; img = 0; txt = 0; tit = 0; W = 0; H = 0; nI = 0; sel = 0; si = 0; ZOOM = 0; rImg = 0; ////////////////// speed = .06; // animation speed delay = .5; // 1 = no delay ////////////////// function dText(){ txt.style.textAlign = tit.style.textAlign = (sel<nI/2)?"left":"right"; txt.innerHTML = O[sel].tx; tit.innerHTML = O[sel].ti; } function CObj(n, s, x, tx, ti){ this.n = n; this.dim = s; this.tx = tx; this.ti = ti; this.is = img[n]; this.vz = 0; this.sx = 0; this.x0 = x; this.x1 = 0; this.zo = 0; this.over = function() { with(this){ if(n!=sel){ O[sel].dim = 100; O[n].dim = ZOOM * 100; sel = n; l = 0; for(k=0; k<nI; k++){ O[k].x0 = l; l += O[k].dim; } txt.innerHTML = tit.innerHTML = ""; setTimeout("dText()", 32); } } } this.anim = function () { with(this){ vz = speed*(vz+(x1-sx)*delay); x1 -= vz; sx = (n==0)?0:O[n-1].x0+O[n-1].dim; zo -= (zo-dim)*speed; l = (x1*si)+6*(n+1); w = zo*si; is.style.left = Math.round(l)+'px'; is.style.top = Math.round((H-w*rImg)*.5)+'px'; is.style.width = Math.round(w)+'px'; is.style.height = Math.round(w*rImg)+'px'; if(sel == n){ if(sel<nI*.5) { tit.style.left = txt.style.left = Math.round(l+w+6)+'px'; } else { tit.style.left = txt.style.left = Math.round(l-(nx*.25)-6)+'px'; } txt.style.top = Math.round(-(w*rImg)*.25)+'px'; tit.style.top = Math.round((w*rImg)*.33)+'px'; } } } } function run(){ for(j in O)O[j].anim(); setTimeout("run()", 16); } function doResize(){ tit.style.width = Math.round(nx*.25)+'px'; txt.style.width = Math.round(nx*.25)+'px'; tit.style.fontSize = (nx/30)+'px'; txt.style.fontSize = (nx/70)+'px'; with(box.style){ width = Math.round(W)+'px'; height = Math.round(H)+'px'; left = Math.round(nx/2-W/2)+'px'; top = Math.round(ny/2-H/2)+'px'; } } function resize(){ nx = scr.offsetWidth; ny = scr.offsetHeight; W = nx*90/100; si = (W-((nI+1)*6))/((ZOOM*100)+((nI-1)*100)); H = (100*si*rImg)+14; doResize(); } onresize = resize; onload = function(){ scr = document.getElementById("screen"); box = document.getElementById("box"); tit = document.getElementById("tit"); txt = document.getElementById("txt"); img = box.getElementsByTagName("img"); Lnk = document.getElementById("lnk").getElementsByTagName("a"); nI = img.length; ZOOM = nI; rImg = img[0].height/img[0].width; resize(); s = ZOOM * 100; x = 0; tit.innerHTML = img[0].title; txt.innerHTML = img[0].alt; for(i=0; i<nI; i++) { var t = img[i].alt; if(Lnk[i].href!="") t+='<br><a href="'+Lnk[i].href+'">'+Lnk[i].innerHTML+'</a>'; O[i] = new CObj(i, s, x, t, img[i].title); img[i].alt = ""; img[i].title = ""; img[i].onmousedown = new Function("return false;"); img[i].onmouseover = new Function('O['+i+'].over();'); if(Lnk[i].href!=""){ /* ==== hyperlink ==== */ img[i].onclick = new Function('window.open("'+Lnk[i].href+'","_blank");'); } x += s; s = 100; } box.style.visibility = "visible"; run(); } </script> </head> <body> <div id="screen"> <div id="box"> <img src="images/08081201001.jpg" title="explain" alt="They explained a little about what they were doing."> <img src="images/08081201002.jpg" title="strain" alt="I hoped I wouldn′t crack under the strain."> <img src="images/08081201003.jpg" title="retain" alt="Clearly they were ready to do almost anything to retain their position."> <img src="images/08081201004.jpg" title="mundane" alt="I observed the face of power at its most mundane."> <img src="images/08081201005.jpg" title="inhumane" alt="But they couldn′t hide the very worst of their inhumane undertakings from the people."> <img src="images/08081201006.jpg" title="disdain" alt="They showed their utter, complete disdain for justice."> <img src="images/08081201008.jpg" title="never again" alt="Never more. Never again."> <span id="txt"></span><span id="tit"></span><span id="lnk"> <a href="http://www.dhteumeuleu.com">www.dhteumeuleu.com</a> <a></a><a> </a><a></a><a></a><a></a><a></a></span></div> </div> <!-- crossbrowser images_loading_bar - Gerard Ferrandez - www.dhteumeuleu.com - Feb 2005 --> <span id="LB0" style="position:absolute;left:50%;top:50%;"> <span style="position:absolute;font-family:arial;font-size:10px;color:#FFFFFF;left:-50px;top:-18px"> Loading...</span> <span style="position:absolute;left:-50px;top:-5px;font-size:1px;width:100px;height:10px;background:#333"> <span id="LB1" style="position:absolute;left:0px;top:0px;font-size:1px;width:0px;height:10px;background:#FFFFFF"> </span></span></span> <script>m00=document.getElementById("box").getElementsByTagName("img");m01=m00.length;function images_loading_bar(){m02=0;for(i=0;i<m01;i++)m02+=(m00[i].complete)?1:0;document.getElementById("LB1").style.width=Math.round(m02/m01*100)+'px';if(m02==m01)setTimeout("document.getElementById('LB0').style.display='none'",128); else setTimeout("images_loading_bar()", 64);};images_loading_bar();</script> <!-- end of images_loading_bar code --> </body> </html>
Javascript闭包与python 闭包
<p>下列代码很好的展示了JS函数的闭包</p> <p> </p> <pre name="code" class="java">var f=[]; for(var i=0;i&lt;10;i++) f.push(function(){alert(i);}); f[0]();</pre> <p> </p> <p><span style="color: #ff0000; font-size: medium;">打印 10.因为 所有f函数都共享同一个作用域window,调用时查找的是同一个window的i,即循环结束后的i<br></span> </p> <p> </p> <p>解决方法很多 ,其中之一是  i 复制到 函数最底层作用域中。</p> <p> </p> <pre name="code" class="js">var f=[]; for(var i=0;i&lt;10;i++) f.push(function(i){return function(){alert(i);}}(i)); f[0](); </pre> <p> </p> <p>据某人说 : perl python 刚开始的表示就可以输出0 ,且有块作用域 ,我觉得 javascript 更合理啊,按照perl python 的做法 ,岂不是 定义函数时把函数里用到的外部变量 全部给自己做copy ???</p> <p> </p> <p>不懂perl,python ,是真的这样么</p> <p> </p> <p> </p> <p>参考 :</p> <p> </p> <h3 class="type_reprint" title="转载"> <a href="../../blog/356700">JavaScript对象模型-执行模型</a> </h3>
java很难模拟闭包?还是我对闭包理解有误?
今天看《Javascript高级程序设计》一书,其中对闭包下了一个定义: <br /> <br />闭包是词法表示包括不必计算的变量的函数。(原书第56页) <br /> <br />还给了一个简单的样例: <br /><pre name="code" class="js"> var t = "hello world"; function closure(){ alert(t); } </pre> <br /> <br />因为变量t在函数closure之外定义,所以closure就是一个必包。 <br /> <br />如果这样的话,用java模拟闭包有何难? <br /> <br /><pre name="code" class="java"> public class SimulateClosure{ private int num; public void setNum(int num){ this.num = num; } public void closure(int origin){ System.out.println(origin*num); } } 客户端调用: SimulateClosure sc = new SimulateClosure(); sc.setNum(1); sc.closure(5);// 输出5 sc.setNum(2); sc.closure(5);// 输出10 </pre> <br /> <br />我写的这个例子是不是闭包?closure方法也使用了方法外部的字段。。客户端调用结果也不同。。 <br /> <br />闭包就这么简单吗?还是我的理解有错误?请高手指教。 <br /><br/><strong>问题补充</strong><br/>达人们,你们在哪里??快来拍我<br/><strong>问题补充</strong><br/>谢谢猫姐!那我写的例子不是闭包,书中提供的例子是不是闭包呢?
form中 type=button 与 type=submit的表单提交的疑问
1.用button提交为什么提交不了,我调用了submit()方法,但是为什么没有进入action里面的页面 2.直接在表单上加 onsubmit="return check();",用jq写的时候这个check()函数应该写在哪 3.关于上面疑问的细节我用注释说明了,搞了大半天还是没有弄清楚,麻烦大神指导指导。不胜感激。 4.check()函数放在$(function(){})外面的时候,当本来该执行里面的return false时,为什么还是提交并进入action里面的页面了呢? ``` <form id="register" name="register" method="get" action="https://www.baidu.com"> <input type="text" name="userName" placeholder="用户名" autocomplete="off"/> <input type="submit" name="submit" value="注册"/> <input type="button" name="show" value="点击"/> </form> <script type="text/javascript"> $(function(){ var name = ''; $("input[name='userName']").blur(function(){ if($(this).val()){ name = $(this).val(); } }); //第一种:button模拟提交 这种为什么提交不了 /*$("input[name='show']").click(function(){ if(name){ $("form#register").submit(); }else{ alert("无法提交"); } })*/ //第二种: 表单加上onsubmit="return check();"验证 //这个函数写在里面,访问上面的变量,但是直接外部onclick绑定没有进函数 function check(){ alert("ok"); //直接未进入函数 if($("input[name='userName']").val()!=null){ //alert("ok"); return true; }else{ //alert("false"); return false; } } }) //这个函数写在外面,外部onclick绑定可以进入该函数,但是无法访问上面已有过控制的变量 /*function check(){ //alert("ok"); //进入函数 if($("input[name='userName']").val()!=null){ //alert("ok"); //有输入时,进入 return true; }else{ //alert("false"); //无输入,为什么没有进入 return false; } }*/ ```
用JS写的贪吃蛇,为什么定时器结束后会自动平移一格?
``` <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>random</title> <style> .map{ width: 800px; height: 600px; background-color: #CCC; position: relative; } </style> </head> <body> <div class="map"></div> <script> //自调用函数----食物的 (function(){ var elements = [];//用来保存每个小方块食物的 //食物就是一个对象,有宽,有高,有颜色,有横纵坐标,先定义构造函数,然后创建对象 function Food(width,height,color,x,y){ this.width=width||20; this.height=height||20; this.color=color||"green"; this.x=x||0; this.y=y||0; } //为原型添加初始化的方法(作用:在页面上显示这个食物) //因为食物要在地图上显示,所以,需要地图的这个参数(map---就是页面上的.class=map的这个div) Food.prototype.init=function(map){ //先删除这个小食物 //外部无法访问的函数 remove(); //设置div的样式 var div = document.createElement("div"); div.style.width=this.width+"px"; div.style.height=this.height+"px"; div.style.backgroundColor=this.color; //先脱离文档流 div.style.position = "absolute"; //随机横纵坐标 this.x = parseInt(Math.random() * (map.offsetWidth / this.width)) * this.width; this.y = parseInt(Math.random() * (map.offsetHeight / this.height)) * this.height; div.style.left = this.x + "px"; div.style.top = this.y + "px"; //把div加到map中 map.appendChild(div); //把div加入到数组elements中 elements.push(div); } function remove(){ for(var i=0;i<elements.length;i++) { //找到这个子元素的父级元素,然后删除这个子元素 elements[i].parentNode.removeChild(elements[i]); //再次把elements中的这个子元素也要删除 elements.splice(i,1); } } //把Food暴露给Window,外部可以使用 window.Food=Food; })(); //自调用函数----小蛇 (function(){ var elements = [];//存放小蛇的每个身体部分 //小蛇的构造 function Snake(width,height,direction) { this.width=width||20; this.height=height||20; this.direction=direction||"right"; this.body=[ {x:3,y:2,color:"red"}, {x:2,y:2,color:"orange"}, {x:1,y:2,color:"orange"} ]; } //为原型添加方法--小蛇初始化的方法 Snake.prototype.init=function(map){ remove(); //循环遍历创建div for(var i=0;i<this.body.length;i++) { //数组中的每个数组元素都是一个对象 var obj=this.body[i]; var div=document.createElement('div'); //设置div的样式 div.style.position = "absolute"; div.style.width = this.width + "px"; div.style.height = this.height + "px"; //横纵坐标 div.style.left = obj.x * this.width + "px"; div.style.top = obj.y * this.height + "px"; //背景颜色 div.style.backgroundColor = obj.color; //方向暂时不定 map.appendChild(div); //把div加入到elements数组中----目的是为了删除 elements.push(div); } } //为原型添加方法---小蛇动起来 Snake.prototype.move=function(food,map){ //改变小蛇的身体的坐标位置 var i=this.body.length-1;//2 for(;i>0;i--) { this.body[i].x=this.body[i-1].x; this.body[i].y=this.body[i-1].y; } //蛇头位置,判断方向---改变小蛇的头的坐标位置 switch(this.direction) { case "right": this.body[0].x+=1; break; case "left": this.body[0].x-=1; break; case "top": this.body[0].y-=1; break; case "bottom": this.body[0].y+=1; break; } //判断小蛇有没有吃到食物 //小蛇的头的坐标和食物的坐标一致 var headX=this.body[0].x*this.width; var headY=this.body[0].y*this.height; //判断小蛇的头的坐标和食物的坐标是否相同 if(headX==food.x&&headY==food.y) { var last=this.body[this.body.length-1]; this.body.push({ x:last.x, y:last.y, color:last.color }); //把食物删除,重新初始化食物 food.init(map); } } function remove(){ //删除map中的小蛇的每个div,同时删除elements数组中的每个元素,从蛇尾向蛇头方向删除div var i = elements.length - 1; for(;i>=0;i--) { //先从当前的子元素中找到该子元素的父级元素,然后再弄死这个子元素 var div=elements[i]; //从map地图上删除这个子元素div div.parentNode.removeChild(div); elements.splice(i, 1); } } window.Snake=Snake; })(); //自调用函数---游戏对象================================================ (function(){ function Game(map) { this.food = new Food();//食物对象 this.snake = new Snake();//小蛇对象 this.map = map;//地图 that = this;//保存当前的实例对象到that变量中-----------------此时that就是this } //初始化游戏-----可以设置小蛇和食物显示出来 Game.prototype.init = function () { //初始化游戏 //食物初始化 this.food.init(this.map); //小蛇初始化 this.snake.init(this.map); //调用自动移动小蛇的方法========================||调用了小蛇自动移动的方法 this.runSnake(this.food, this.map); //调用按键的方法 this.bindKey();//======================================== }; //添加原型方法---设置小蛇可以自动的跑起来 Game.prototype.runSnake=function(food,map){ //自动的去移动 var timeId = setInterval(function () { //此时的this是window //移动小蛇 this.snake.move(food, map); //初始化小蛇 this.snake.init(map); //横坐标的最大值 var maxX = map.offsetWidth / this.snake.width; //纵坐标的最大值 var maxY = map.offsetHeight / this.snake.height; //小蛇的头的坐标 var headX = this.snake.body[0].x; var headY = this.snake.body[0].y; //横坐标 if (headX < 0 || headX >= maxX) { //撞墙了,停止定时器 clearInterval(timeId); alert("游戏结束"); } //纵坐标 if (headY < 0 || headY >= maxY) { //撞墙了,停止定时器 clearInterval(timeId); alert("游戏结束"); } }.bind(that), 150); } //添加原型方法---设置用户按键,改变小蛇移动的方向 Game.prototype.bindKey=function(){ document.addEventListener("keydown",function(e){ //获取用户的按键,改变小蛇的方向 //这里的this应该是触发keydown的事件的对象---document, //所以,这里的this就是document //获取按键的值 switch (e.keyCode){ case 37: this.snake.direction="left"; if(snake_direction=="right") { this.snake.direction="right"; } else{ snake_direction="left"; } break; case 38: this.snake.direction="top"; if(snake_direction=="bottom") { this.snake.direction="bottom"; } else{ snake_direction="top"; } break; case 39: this.snake.direction="right"; if(snake_direction=="left") { this.snake.direction="left"; } else{ snake_direction="right"; } break; case 40: this.snake.direction="bottom"; if(snake_direction=="top") { this.snake.direction="top"; } else{ snake_direction="bottom"; } break; } }.bind(that)); } window.Game=Game; })(); //初始化游戏对象 var gm = new Game(document.querySelector(".map")); //初始化游戏---开始游戏 gm.init(); </script> </body> </html> ```
请教一个JVM内存优化的问题
<p>自己写的一个WEB爬虫程序,程序方面的优化我自己感觉做的不错了,各种对象的使用都想办法不让内存浪费。 <br />但还是吃内存吃的很厉害 <br />我想主要的消耗在于,对于每一个爬下来的网页,都要变成String在内存中分析超链接,这个估计很大。 <br />另外对于每一个分析到的URL,都需要保存起来。 <br /><br /><br />我当前使用的内存优化参数如下 <br />-Xms1024M -Xmx1024M -Xmn512M -Xss128K -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:MaxPermSize=128M -XX:NewSize=128M -XX:MaxNewSize=128M -XX:SurvivorRatio=8 <br /><br />机器内存是1G。。上面那堆参数,除了最大最小堆内存我也是不求甚解,不是非常明白我设置了什么。网上搜答案也是五花八门,希望大家能推荐一个内存优化参数的文章 <br />另外我上面设置的参数有哪些方面可以优化,或者哪些地方写的不对。 <br /><br />核心的代码我都贴到下面:(我是刚入门的菜鸟,大家别笑话我写的差哦) <br /><br />这个是主类,负责控制,那个monitor大家就当做System.out.println,其实就是</p> <pre name="code" class="java">package com.wood.core; import java.util.concurrent.*; import java.util.*; import com.wood.core.monitor.*; public class CrawlerController implements Runnable { //一个类,用来管理URL,由各抓取线程共享 private URLMap urlmap; //已成功处理URL总数 private int count; //目标完成任务总数 private int total; //管理所有的抓取线程,必要时进行关闭,由于抓取线程存在I/O读取,而I/0读取中的线程是不可中断的,需调用线程的cancel函数 private Crawler[] crawlers; //线程工厂,可以监视产生的线程工作状态 private CrawlerFactory factory; //线程数目 private int threadMax; //当前活动线程 private int threadActive; //线程执行器 private ExecutorService exec; //当系统关闭时取消 private boolean canceled; public CrawlerController(String seed) { this(seed,20,10000); } public CrawlerController(List&lt;string&gt; seeds) { this(seeds,20,10000); } public CrawlerController(String seed,int threadNum) { this(seed,threadNum,10000); } public CrawlerController(List&lt;string&gt; seeds,int threadNum) { this(seeds,threadNum,10000); } public CrawlerController(String seed,int threadNum,int total) { //初始化URLMap,保存抓取启始位置 urlmap=new URLMap(seed); init(threadNum, total); } public CrawlerController(List&lt;string&gt; seeds,int threadNum,int total) { urlmap=new URLMap(seeds); init(threadNum, total); } //构造 private void init(int threadNum,int total) { //初始完成URL总数为0 count=0; //设置目标完成总数 this.total=total; threadMax=threadNum; threadActive=threadNum; //初始化工作线程 crawlers=new Crawler[threadMax]; String id="Crawler "; for(int i=0;i&lt;threadmax;i++) crawlers[i]="new" crawler(id+(i+1),this,urlmap);="" factory="new" crawlerfactory();="" exec="Executors.newCachedThreadPool(factory);" canceled="false;" }="" 检查当前工作线程状态,并打印系统状态="" private="" boolean="" check()="" {="" if(canceled)="" return="" false;="" int="" count="getCount();" if(count=""&gt;total) { MonitorHolder.getMonitor().print("已抓取"+COUNT+"页面,完成目标任务"+total+"页面\n"); cancel(); return false; } threadActive=factory.getActive(); /*if(threadActive&lt;=0) { MonitorHolder.getMonitor().print("无活动工作线程,抓取任务提前结束\n"); cancel(); return false; }*/ MonitorHolder.getMonitor().print_status("统计信息:成功抓取"+COUNT+"页面,当前活动线程为"+threadActive+"个\n"); return true; } //结束抓取 public void cancel() { //调用每个抓取线程的离开方法 for(Crawler cw:crawlers) cw.cancel(); //销毁工厂 factory.destory(); exec.shutdownNow(); MonitorHolder.getMonitor().print("成功结束抓取工作,共抓取"+getCount()+"页面\n"); this.canceled=true; } public synchronized void count() { count++; } public synchronized int getCount() { return count; } public int getTotal() { return total; } public URLMap getMap() { return urlmap; } @Override public void run() { while(!Thread.currentThread().isInterrupted() &amp;&amp; !canceled) { try { MonitorHolder.getMonitor().print("初始化完毕\n"); MonitorHolder.getMonitor().print("开始抓取工作\n"); for(Crawler cw:crawlers) exec.execute(cw); int check_count=0; while (check()){ TimeUnit.SECONDS.sleep(5); check_count++; if(check_count==24) { //每2分钟把待处理URL队列打乱一次 urlmap.shuffle(); MonitorHolder.getMonitor().print("控制信息!!!待抓取URL顺序将打乱\n"); check_count=0; System.gc(); } } } catch (InterruptedException e) { MonitorHolder.getMonitor().print("抓取工作被中断\n"); cancel(); } } } public static void main(String[] args) { List&lt;string&gt; seeds=new ArrayList&lt;string&gt;(15); //问问的各个分类 seeds.add("http://wenwen.soso.com/"); seeds.add("http://wenwen.soso.com/z/c1879048192.htm"); seeds.add("http://wenwen.soso.com/z/c1090519040.htm"); seeds.add("http://wenwen.soso.com/z/c1627389952.htm"); seeds.add("http://wenwen.soso.com/z/c855638016.htm"); seeds.add("http://wenwen.soso.com/z/c1191182336.htm"); seeds.add("http://wenwen.soso.com/z/c1191182336.htm"); seeds.add("http://wenwen.soso.com/z/c620756992.htm"); seeds.add("http://wenwen.soso.com/z/c553648128.htm"); seeds.add("http://wenwen.soso.com/z/c385875968.htm"); seeds.add("http://wenwen.soso.com/z/c687865856.htm"); seeds.add("http://wenwen.soso.com/z/c16777216.htm"); seeds.add("http://wenwen.soso.com/z/c318767104.htm"); seeds.add("http://wenwen.soso.com/z/c150994944.htm"); seeds.add("http://wenwen.soso.com/z/c922746880.htm"); seeds.add("http://wenwen.soso.com/z/c83886080.htm"); CrawlerController controller=new CrawlerController(seeds,5,2000000); List&lt;string&gt; format=new ArrayList&lt;string&gt;(10); //问问回答问题的格式 format.add("http://wenwen.soso.com/z/q"); controller.getMap().addLimit(format); Thread thread=new Thread(controller); thread.start(); } } </pre> <p><br /></p> <pre name="code" class="java">package com.wood.core; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.*; import java.io.*; import java.net.*; import com.wood.core.monitor.*; public class Crawler implements Runnable { //抓取线程ID private String id; //控制器 private CrawlerController controller; //URL,供各线程共享 private URLMap urlmap; private boolean canceled; //保存抓取的网页内容,用于分析超链接 private String content; //字符集 private String charset; //匹配超链接的正则表达式 private String link_reg="&lt;a\\s+(.*?)href\\s*=\\s*\"?(.*?)[\"(\\s*?)](.*?)&gt;"; private Pattern link_pattern=Pattern.compile(link_reg,Pattern.CASE_INSENSITIVE); //匹配字符集的正则表达式 private String charset_reg="&lt;meta\\s+http-equiv=\"content-type\"\\s+content=\"text html;="" charset="(.*?)\&amp;quot;(.*?)"&gt; "; private Pattern charset_pattern=Pattern.compile(charset_reg, Pattern.CASE_INSENSITIVE); private Pattern dir_path_pattern=Pattern.compile("^\\w+$", Pattern.CASE_INSENSITIVE); //保存当前抓取的URL的主机 private String host; //生成待建立的文件夹名 private String host_path; //抓取网页的根目录 private String root_path="E:\\web"; private File root_dir=new File(root_path); //输入来自URL,输出到文件 private InputStreamReader in=null; private OutputStreamWriter out=null; //输入输出缓冲区 private char[] buf=new char[10240]; //网页内容缓冲区 private StringBuilder contentbuilder=new StringBuilder(1024*1024); //通过一个URL,下载网页内容 private void download(URL url) { in=null; out=null; //建立抓取文件 String urlfile=url.getFile(); if(urlfile.endsWith("/")) urlfile+="indexindex"; File file=new File(host_path,urlfile); File file_dir=new File(file.getParent()); if(!file_dir.exists()) file_dir.mkdirs(); MonitorHolder.getMonitor().print(id+"开始准备下载"+url.toString()+"\n"); try { //打开链接 URLConnection conn=url.openConnection(); //超时30秒 conn.setConnectTimeout(30000); conn.setDoOutput(true); //不是HTML不下载 /*String type=conn.getContentType(); if( (type==null)|| (!type.equals("text/html")) ) return;*/ //将网页内容的缓冲区清空 contentbuilder.setLength(0); in=new InputStreamReader(conn.getInputStream(),charset); out=new OutputStreamWriter(new FileOutputStream(file),charset); int len; //读取网页内容,并写入文件,保存到网页内容缓冲里面 while((len=in.read(buf, 0, 10240)) &gt;0) { out.write(buf, 0, len); //append可以减小系统损耗 contentbuilder.append(buf, 0, len); } out.flush(); //将网页内容缓冲区的内容读到content中,用于分析 content=null; content=contentbuilder.toString(); } catch (IOException e) { MonitorHolder.getMonitor().print("错误!!!"+id+"下载页面"+url.toString()+"错误\n"); } finally{ try { if(in!=null) in.close(); if(out!=null) out.close(); } catch (IOException e) { } in=null; out=null; } } public Crawler(String id,CrawlerController controller,URLMap urlmap) { this.id=id; this.controller=controller; this.urlmap=urlmap; this.charset="utf-8"; canceled=false; MonitorHolder.getMonitor().print(id+"就绪\n"); } //设置字符集,通过正则表达式获取字符集格式 //为了性能,该功能并未使用 private void setCharset() { Matcher matcher=charset_pattern.matcher(content); String CHARSET="GB2312"; if(matcher.find()) CHARSET=matcher.group(1).trim(); this.charset=CHARSET; try { content=new String(content.getBytes("GB2312"),CHARSET); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } //从网页内容中分析超链接 private List&lt;string&gt; retrieveLinks(URL url) { List&lt;string&gt; urls=new LinkedList&lt;string&gt;(); if(content==null) return urls; Matcher matcher=link_pattern.matcher(content); String link; String host_reg="http://"+host; String host_nowww; if(host.contains("www")) host_nowww=host.substring(host.lastIndexOf("w")+2); else { host_nowww=host; } while(matcher.find()) { //通过抓取第1组的内容 link=matcher.group(2).trim().toLowerCase(); if (link.length() &lt; 1) { continue; } //网页内部链接,忽略 if (link.charAt(0) == '#') { continue; } //发送邮件链接,忽略 if (link.indexOf("mailto:") != -1) { continue; } if (link.toLowerCase().indexOf("javascript") != -1) { continue; } //分析绝对地址或相对地址 if (link.indexOf("://") == -1){ if (link.charAt(0) == '/') //处理绝对地址 link = "http://" + host+ link; else if(link.startsWith("./")) link="http://" + host+ link.substring(1); else { String file = url.getFile(); String file_path=file.substring(0, file.lastIndexOf('/')); while(link.startsWith("../")) { link=link.substring(link.indexOf("/")+1); file_path=file_path.substring(0, file_path.lastIndexOf("/")); } link="http://"+host+file_path+"/"+link; } } int index = link.indexOf('#'); if (index != -1) { link = link.substring(0, index); } if(!urlmap.testHost(link)) continue; if(!urlmap.testLimit(link)) continue; urls.add(link); } return urls; } //设置主机并建立目录 private void setHost(String host) { this.host=host; this.host_path=root_path+"\\"+host; File host_dir=new File(host_path); if(!host_dir.exists()) host_dir.mkdirs(); } @Override public void run() { if(!root_dir.exists()) root_dir.mkdirs(); while(!Thread.currentThread().isInterrupted() &amp;&amp; !canceled &amp;&amp; (controller.getCount()&lt;controller.gettotal()) )="" {="" try="" {="" 获得一个待抓取的url,如果没有可用url,则进入阻塞状态,该方法调用是线程安全的="" string="" urlstring="urlmap.getURL();" monitorholder.getmonitor().print(id+"开始抓取"+urlstring+"\n");="" 建立url="" url="" url="new" url(urlstring);="" 设置主机="" sethost(url.gethost());="" 清空网页内容,并下贼="" content="null;" download(url);="" 未下载到内容="" if(content="=null)" {="" continue;="" }="" monitorholder.getmonitor().print(id+"抓取"+urlstring+"完毕,进行解析\n");="" setcharset();="" 分析超链接="" list&lt;string=""&gt; urls=retrieveLinks(url); //将分析到的超连接加入到待抓取的URL队列中,并将成功抓取数+1 urlmap.addAll(urls); controller.count(); MonitorHolder.getMonitor().print(id+"解析"+urlstring+"完毕,共计"+urls.size()+"个超链接,开始新任务\n"); content=null; TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { MonitorHolder.getMonitor().print(id+"被中断\n"); canceled=true; } catch (MalformedURLException e) { MonitorHolder.getMonitor().print(id+"报告:URL格式错误\n"); }catch (Exception e) { e.printStackTrace(); } } } //退出,由控制器调用,关闭所有底层I/O资源 public void cancel() { try { if(in!=null) in.close(); } catch (IOException e) { } try { if(out!=null) out.close(); } catch (IOException e) { e.printStackTrace(); } MonitorHolder.getMonitor().print(id+"停止工作\n"); canceled=true; } } </pre> <p> </p> <pre name="code" class="java">package com.wood.core; import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.*; import java.util.*; public class URLMap { //待抓取的URL队列 private LinkedList&lt;string&gt; URLQueue; //缓存解析出来的URL,使用Hash方便快速查找,&lt;k,false&gt;表示未抓取,&lt;k,true&gt;表示抓取结束 private HashMap&lt;string,boolean&gt; cachedURL; private HashSet&lt;string&gt; hosts; private HashSet&lt;string&gt; format_limit; //默认构造器,初始化队列,集合 private URLMap() { URLQueue=new LinkedList&lt;string&gt;(); cachedURL=new HashMap&lt;string,boolean&gt;(50000); hosts=new HashSet&lt;string&gt;(20); format_limit=new HashSet&lt;string&gt;(20); } public URLMap(List&lt;string&gt; seeds) { this(); for(String s:seeds) cachedURL.put(s, false); URLQueue.addAll(seeds); for (String string : seeds) { try { URL test=new URL(string); String host=test.getHost(); hosts.add(host); } catch (MalformedURLException e) { e.printStackTrace(); } } } public URLMap(String seed) { this(); cachedURL.put(seed, false); URLQueue.add(seed); try { URL test=new URL(seed); hosts.add(test.getHost()); } catch (MalformedURLException e) { e.printStackTrace(); } } //将解析出来的URL添加到URLMap中,如果有重复则忽略,URL有效性由外部保证,该方法是线程安全的 public synchronized void addURL(String url) throws InterruptedException { //如果该URL已存在,忽略该URL if(cachedURL.keySet().contains(url)) return; cachedURL.put(url, false); URLQueue.add(url); //有可用URL,唤醒所有阻塞线程 notifyAll(); } //将解析出来的URL添加到URLMap中,如果有重复则忽略,URL有效性由外部保证,该方法是同步的 public synchronized void addAll(List&lt;string&gt; urls) throws InterruptedException { for (String url : urls) { if(cachedURL.keySet().contains(url)) continue; cachedURL.put(url,false); URLQueue.add(url); } notifyAll(); } //从当前URL队列中获取一个URL,如果当前队列无可用URL,则该线程进入阻塞状态 public synchronized String getURL() throws InterruptedException { //该处进入阻塞 while(URLQueue.size()==0) wait(); //将其从队列中删除 String url=URLQueue.remove(); cachedURL.put(url, true); return url; } public boolean testHost(String host) { for(String host_allow:hosts) { if(host.contains(host_allow)) return true; } return false; } public void addHost(List&lt;string&gt; l) { hosts.addAll(l); } public void addLimit(List&lt;string&gt; l) { format_limit.addAll(l); } public boolean testLimit(String url) { if(format_limit.size()==0) return true; else { for(String s:format_limit) if(url.contains(s)) return true; } return false; } //将待抓取队列打乱 private int swap_check=0; public synchronized void shuffle() { swap_check++; int size=URLQueue.size(); if(size&lt;1000) { java.util.Collections.shuffle(URLQueue); swap_check=0; } else { if(size&gt;=1000 &amp;&amp; size&lt;5000) { if(swap_check==5) { java.util.Collections.shuffle(URLQueue); swap_check=0; } } else { if(swap_check==15) { java.util.Collections.shuffle(URLQueue); swap_check=0; } } } } } </pre> <p><br /><br />附件里是内存使用情况<br /><strong>问题补充</strong><br />主要占用内存的是char[] <br />我的策略是所有分析到的有效URL都存储在HashMap中 <br />但是几万个URL不至于占用大多数内存吧? <br />我的工作线程只有5个,设置的多了,一会就崩了 <br /><br />哪位高人路过,帮我看眼吧 <br />祝你新年好运~</p> <p> </p> <p>附件里是内存占用,缓存的URL总数是20000个,一个大概占用80B,程序内存总数是150MB</p> <p>我不知道到底是什么东西不停的吃内存,回收不掉,程序运行的时间越长,线程数越多,内存吃的越快</p>
dataview 布局问题
布局思路:tabpanel中放一个panel panel中放一个dataview 外部函数调用function BuildDataView(Mudle_TypeID, Mudle_Title) BuildDataView调用function CreateDataViewByModleID(Mudle_TypeID) 问题:当dataview中的记录数不多的时候 布局时好的 但是如果多了 需要出现上下滚动条后 我发现左右滚动条也出现了 图片: 正确的时候: [img]http://dl.iteye.com/upload/attachment/141979/f7263067-fcbd-3e10-9fe6-1c1db1395ec8.bmp[/img] 错误的时候: [img]http://dl.iteye.com/upload/attachment/141981/9fb30f8b-1df9-394b-b8cd-b37b4bc7dd79.bmp[/img] 代码: [code="java"] //用于智能提示显示 ///<reference path="../vswd-ext_2.2.js" /> //------------------------内部方法------------------------ function CreateDataViewByModleID(Mudle_TypeID) { //数据获取地址 var strGridUrl = 'json/Forum/Article.aspx?Param=list&MudleId=' + Mudle_TypeID; //数据集格式 var fields = [ {name: 'ModuleID'}, {name: 'ArticleID'}, {name: 'strArticleTitle'}, {name: 'strAuthorName'}, {name: 'dtPublishTime'}, {name: 'ReaderNum'}, {name: 'ReplayNum'} ]; //数据集内容 var store = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({ url: strGridUrl }), reader: new Ext.data.JsonReader({ totalProperty: 'totalProperty', root: 'root', fields: fields }) }); var tpl = new Ext.XTemplate('<tpl for=".">', '<div style="width:100%;BORDER-BOTTOM: 1px outset;border-bottom-color:Blue;margin:0,0,0,0;padding:0,0,0,0;">', '<table style="width:99%;border:0px;" cellpadding="0px" cellspacing="0px">', '<tr>', '<td style="width:70%;font-size:larger;">', '<a href="http://www.google.com" target="_blank">{strArticleTitle}</a>', '</td>', '<td style="width:30%">', '<table style="font-size:small;color:Gray;" cellspacing="0" cellpadding="0">', '<tr><td></td></tr>', '<tr>', '<td style="width:50%">', '作者:{strAuthorName}', '</td>', '<td style="width:50%">', '发表:{dtPublishTime}', '</td>', '</tr>', '<tr>', '<td style="width:50%">', '阅读:{ReaderNum}', '</td>', '<td style="width:50%">', '回复:{ReplayNum}', '</td>', '</tr>', '</table>', '</td>', '</tr>', '</table>', '</div>', '</tpl>' // ,'<div class="x-clear"></div>' ); //DataView store.load({ params: { start: 0, limit: 30 } }); var My_DataView = new Ext.DataView({ store: store, multiSelect: false, emptyText: '暂无数据', autoHeight: true, overClass: 'x-view-over', itemSelector: 'div.thumb-wrap', tpl: tpl, region: 'center', margions: '0,0,0,0', region: 'center' }); // // var My_PTbar = new Ext.PagingToolbar({ displayInfo: true, emptyMsg: '没有数据显示', displayMsg: '当前显示{0}-{1}条记录,共{2}条', store: store, pageSize: 30, prevText: "上一页", nextText: "下一页", refreshText: "刷新", lastText: "最后页", firstText: "第一页", beforePageText: "当前页" }) //构建返回Panel return new Ext.Panel({ id: 'CenterPanel_' + Mudle_TypeID, layout: 'fit', autoScroll: true, items: My_DataView, bbar: My_PTbar //,layout : 'border' , border: false, margions: '0,0,0,0' }); } //------------------------外部方法------------------------ //根据moduleName 和 moduleId 创建该页 function BuildDataView(Mudle_TypeID, Mudle_Title) { //创建Grid var temp_DataView = CreateDataViewByModleID(Mudle_TypeID); //创建并返回Panel this.GirdViewPanel = new Ext.Panel({ title: Mudle_Title, id: 'GirdViewPanel_' + Mudle_Title, frame: false, autoWidth: true, autoheight: true, autoScroll: true, closable: true, layout: 'fit', collapsible: true, items: [temp_DataView] }); } [/code] [b]问题补充:[/b] 我看了一下 是不是 因为出现了纵向的滚动条的原因 纵向的滚动条会占据部分位置 所以出现了横向的滚动条? [b]问题补充:[/b] 如何测试 是什么地方溢出的呢?请教方法 我以前没有做个这个 还有根据atian25的建议 我去掉了一个中间的panel 重新修改了布局方式: 主界面的center位置放tabpanel west位置放tree 当点击tree的时候 在tabpanel中添加一个panelA PanelA中的就是dataview 和 pagingtool 但是还是有问题,如下图: [img]http://dl.iteye.com/upload/attachment/142011/ff33980f-4cc2-36a7-8ba1-50d25fa31f05.bmp[/img] 图中黑框中是滚动条 虽然几乎看不见=.= 妖怪。。。 请指点一下 修改后的代码: [code="java"] function BuildDataView(Mudle_TypeID, Mudle_Title) { //数据获取地址 var strGridUrl = 'json/Forum/Article.aspx?Param=list&MudleId=' + Mudle_TypeID; //数据集格式 var fields = [{ name: 'ModuleID' }, { name: 'ArticleID' }, { name: 'strArticleTitle' }, { name: 'strAuthorName' }, { name: 'dtPublishTime' }, { name: 'ReaderNum' }, { name: 'ReplayNum' }]; //数据集内容 var store = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({ url: strGridUrl }), reader: new Ext.data.JsonReader({ totalProperty: 'totalProperty', root: 'root', fields: fields }) }); //tpl var tpl = new Ext.XTemplate('<tpl for=".">', '<div style="width:100%;BORDER-BOTTOM: 1px outset;border-bottom-color:Blue;margin:0,0,0,0;padding:0,0,0,0;">', '<table style="width:99%;border:0px;" cellpadding="0px" cellspacing="0px">', '<tr>', '<td style="width:70%;font-size:larger;">', '<a href="http://www.google.com" target="_blank">{strArticleTitle}</a>', '</td>', '<td style="width:30%">', '<table style="font-size:small;color:Gray;" cellspacing="0" cellpadding="0">', '<tr><td></td></tr>', '<tr>', '<td style="width:50%">', '作者:{strAuthorName}', '</td>', '<td style="width:50%">', '发表:{dtPublishTime}', '</td>', '</tr>', '<tr>', '<td style="width:50%">', '阅读:{ReaderNum}', '</td>', '<td style="width:50%">', '回复:{ReplayNum}', '</td>', '</tr>', '</table>', '</td>', '</tr>', '</table>', '</div>', '</tpl>', '<div class="x-clear"></div>'); //DataView var My_DataView = new Ext.DataView({ store: store, multiSelect: false, emptyText: '暂无数据', autoHeight: true //,autoWidth:true , tpl: tpl, region: 'center', margions: '0,0,0,0', region: 'center' }); store.load({ params: { start: 0, limit: 30 } }); // var My_PTbar = new Ext.PagingToolbar({ displayInfo: true, emptyMsg: '没有数据显示', displayMsg: '当前显示{0}-{1}条记录,共{2}条', store: store, pageSize: 30, prevText: "上一页", nextText: "下一页", refreshText: "刷新", lastText: "最后页", firstText: "第一页", beforePageText: "当前页" }) //创建并返回Panel this.GirdViewPanel = new Ext.Panel({ title: Mudle_Title, id: 'GirdViewPanel_' + Mudle_Title, frame: false, autoWidth: true // ,autoheight:true , autoScroll: true, closable: true, layout: 'fit', collapsible: true, items: [My_DataView], bbar: My_PTbar, viewCofnig: { forceFit: true } }); } [/code] [b]问题补充:[/b] 在FF测试了上面的代码 界面表现堪称完美 上下滚动条出来了 左右滚动条没有出来。。。 BS下IE 这个NND我怎么去改阿。。。 [b]问题补充:[/b] 解决了 1。dateview XTemplate里面的width:100%之类的也先去掉一下 2。table style="width:99%; 修改为table style="width:98%; 谢谢 atian25 如果有时间的话 希望atian25 给我说说如何查看 panel溢出的方法
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
阿里P8数据架构师:顶级开发者都在用什么数据库?
其实从去年已经隐隐约约感觉到数据库的有变化,只是没有想到变得这么快。今年的一些事情实实在在地给了某些数据库重击,如果以前去某数据库还是喊喊,然后该用还用,今年从传统领域刮起的去某数据库的风,已经开始了,并且后面的乌云密布也看得见。 最近看一篇国外的开源产品提供厂商的一篇文字,主要是在询问了他的几百位客户后得出了下图中的2019年数据库的使用趋势。 从图中可以看出,MySQL以38.9...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
互联网公司分布式系统架构演进之路
介绍 分布式和集群的概念经常被搞混,现在一句话让你明白两者的区别。 分布式:一个业务拆分成多个子业务,部署在不同的服务器上 集群:同一个业务,部署在多个服务器上 例如:电商系统可以拆分成商品,订单,用户等子系统。这就是分布式,而为了应对并发,同时部署好几个用户系统,这就是集群 1 单应用架构 2 应用服务器和数据库服务器分离 单机负载越来越来,所以要将应用服务器和数据库服务器分离 3 应用服务...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
程序员需要了解的硬核知识之汇编语言(一)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。 汇编语言和本地代码 我们在之前的文章中探讨过,计算机 CPU 只能运行本地代码(机器语言)程序,用 C 语言等高级语...
OpenCV-Python 绘图功能 | 七
目标 学习使用OpenCV绘制不同的几何形状 您将学习以下功能:cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText()等。 代码 在上述所有功能中,您将看到一些常见的参数,如下所示: img:您要绘制形状的图像 color:形状的颜色。对于BGR,将其作为元组传递,例如:(255,0,0)对于蓝色。对于灰度,只需传递...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
Java知识体系最强总结(2020版)
更新于2019-12-15 10:38:00 本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。 文章目录...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Fiddler+夜神模拟器进行APP抓包
Fiddler+夜神模拟器进行APP抓包 作者:霞落满天 需求:对公司APP进行抓包获取详细的接口信息,这是现在开发必备的。 工具:Fiddler抓包,夜神模拟器 模拟手机 安装APP 1.下载Fiddler https://www.telerik.com/download/fiddler Fiddler正是在这里帮助您记录计算机和Internet之间传递的所有HTTP和HTTPS通信...
小白学 Python 爬虫(42):春节去哪里玩(系列终篇)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(...
一文带你看清 HTTP 所有概念
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就来深究一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层) HTTP 标头 先来回顾一下 HTTP1.1 标头都有哪几种 HTTP 1.1 的标头主要分为四种,通用标头、实体标头、请求标头、响应标头,现在我们来对这几种标头进行介绍 通用...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
[数据结构与算法] 排序算法之归并排序与基数排序
归并排序 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 基本思想 可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
史上最牛逼的 Eclipse 快捷键,提高开发效率!
如果你在使用IDEA,请参考博主另外的一篇idea快捷键的博客。
如何快速打好Java基础?
二哥,我是一名大学生,专业是电力工程,但想自学 Java,如何快速打好基础呢? 微信上 tison 向我提出了这个问题。我想我是有资格来回答的,从北京奥运会那年开始学 Java,到现在已经有 10 多个年头了,真的是从一名编程白痴一步步走到现在的。 我在各大技术网站上分享了不少 Java 方面的原创文章,不知道影响了多少初学者,反正文章的留言中经常能看到他们由衷的感谢。现在每天仍然有不少同学(...
在三线城市工作爽吗?
我是一名程序员,从正值青春年华的 24 岁回到三线城市洛阳工作,至今已经 6 年有余。一不小心又暴露了自己的实际年龄,但老读者都知道,我驻颜有术,上次去看房子,业务员肯定地说:“小哥肯定比我小,我今年还不到 24。”我只好强颜欢笑:“你说得对。” 从我拥有记忆到现在进入而立之年,我觉得,我做过最明智的选择有下面三个: 1)高中三年,和一位女同学保持着算不上朋友的冷淡关系;大学半年,把这位女同学追到...
相关热词 c# singleton c#中类的默认值是 c#各种进制之间的转换 c# 正则表达式保留汉字 c#后台跨域 c#基础代码大全 c#指定combox选择 c#关系 mono c# 相差毫秒 用c#做一个简易计算器
立即提问