重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

c到javascript的简单介绍

有c语言基础想学JavaScript从哪里入门 求书籍推荐

JavaScript权威指南(注重基础理论知识)和JavaScript高级程序设计(侧重实例),两本书都很重要啊。都是外国人写的,如果英语基础好,最好看原版,否则就将就着看翻译版吧。国人写的就不要看了,浪费时间。运行Javascript的工具就是浏览器,不需要额外安装软件。

成都创新互联是专业的桐梓网站建设公司,桐梓接单;提供成都网站制作、做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行桐梓网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

学习javascript需要先学C语言吗?

学javascript的话确实有C语言基础比较好,因为javascript从C-minus发展到ECMAscript,最终才是javascript,但是javascript的难点不在它的语法上,而是在他的浏览器兼容性上,这点是万恶的微软搞出来的。javascript和C的难点是不一致的,所以没必要去学C语言。javascript要记住的东西非常多,而且条例不是很清楚,一般感觉比C语言用起来还麻烦。

既然做web前端的话,美工比javascript重要的多,毕竟有时候前端代码都有现成的模板可以使用。相比之下javascript很多代码都是通过后台脚本直接嵌入到html页面中的,比如Ajax代码等。所以前端的话,初期只要会dom编程即可,能看懂框架代码,慢慢理解就是了。

最难的部分是CSS,布局这点比javascript难的多,浏览器兼容性更令人伤心,毕竟javascript还有jquery等框架可以使用,但是css就没这么幸运了,除了某些css属性可以通过jquery等框架屏蔽兼容之外,必须要手动调试。

反正到最后你都必须精通HTML+CSS+javascript,内容很少,但是很杂论,作为吃饭的工具,你不得不精通。甚至到最后你还得回后台代码才行比如,PHP 、java、C#等,因为单单是做前端的很少的,大部分公司都是混合前后台的,除了某些大公司,专门找美术专业的做前台设计。

如何将c++绑定至javascript

下载绑定生成器,本机路径/Users/iven/Dev/bindings-generator

为了在Mac OS X中安装运行MacPort端口,系统必须要已经安装苹果的“Command Line Developer Tools”(命令行开发者工具)。Xcode 4及以后版本的用户首先需要通过启动或运行Xcode接受Xcode EULA。

xcodebuild -license

下载安装MacPort

注意:如果是Homebrew用户,应该先卸载Homebrew。因为Homebrew不兼容MacPort。

同时执行MacPort的“selfupdate”命令以确保安装最新的发布版本。

sudo port -v selfupdate

当更新完成之后,使用MacPort在命令行中安装python依赖(dependencies)

sudo port install python27 py27-yaml py27-cheetah

你会看到如下所示:

下载llvm-3.3,解压至$HOME/bin目录。如果没有bin目录,请创建一个bin目录,将未解压的ZIP压缩包重命名为“clang+llvm-3.3”。

最后目录如下所示:/Users/guanghui/bin/clang+llvm-3.3(guanhui是本机的主目录名字)

样本代码

绑定生成器资源库中包括一个样本测试用例。打开bindings-generator/test/simple_test文件夹。

配置

根据自己的环境个性化设置“test/userconf.ini”和“test/user.cfg”文件。

注意:应该移除后缀为“.sample”的文件如“user.cfg.sample”和“userconf.ini.sample”

[DEFAULT]

androidndkdir=/Users/iven/Dev/android-ndk-r8c

clangllvmdir=/Users/iven/Dev/clang+llvm-3.1-x86_64-apple-darwin11

cxxgeneratordir=/Users/iven/Dev/bindings-generator-master

user.cfg配置如下所示

PYTHON_BIN=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/ python2.7

运行测试样本

./test.sh

如果环境设置正确,你会看到如下所示:

Errors in parsing headers:

1. severity = Warning,

location =SourceLocation file None, line 0, column 0,

details = "argument unusedduring compilation: '-nostdinc++'"

不用担心这个警告,你已完成运行,测试用例会创建一个包含3个文件的“simple_test_bindings”目录。

一个绑定类的.hpp头文件

一个实现绑定类的.cpp文件

一个介绍如何(从Java脚本)调用C++类暴露方法的.js文件。

运行测试

Create a JS base Cocos2d-x project. 创建基于JS的Cocos2d-x项目

将“simple_Test folder”文件夹和“simple_test_binding”文件夹添加到项目中

修改“autogentestbindings.cpp”中的注册函数如下:

void register_all_autogentestbindings(JSContext* cx, JSObject* obj) {

jsval nsval;

JSObject *ns;

JS_GetProperty(cx, obj, "ts",nsval);

if (nsval == JSVAL_VOID) {

ns = JS_NewObject(cx, NULL, NULL, NULL);

nsval = OBJECT_TO_JSVAL(ns);

JS_SetProperty(cx, obj, "ts",nsval);

} else {

JS_ValueToObject(cx,nsval, ns);

}

obj = ns;

js_register_autogentestbindings_SimpleNativeClass(cx, obj);

}

注意:如果你将“ts”添加到“test.ini”文件中的“target_namespace”变量里,便会自动生成代码。无需修改。

target_namespace =ts

在“AppDelegate”中注册

包含头文件“autogentestbindings.hpp”然后注册回调函数:

sc-addRegisterCallback(register_all_autogentestbindings);

在“hello.js”文件适当地方增加以下代码。本机将“init f”函数放在第一个场景。

var myClass=new ts.SimpleNativeClass();

var myStr=myClass.returnsACString();

var label = cc.LabelTTF.create(myStr, "Helvetica", 20.0);

限制

绑定生成器存在以下两个限制

自变量数字参数无法工作,所以需要手动编写包装器

代表类无法工作,所以需要手动绑定,详见下一部分。

手动 JSB 绑定

本指南将介绍利用Cocos2d-x 2.14模板如何在自己的项目中实现JSB绑定。

首先用Cocos2d-js模板创建项目。其次,我们会介绍如何一步一步从JS调用本地函数。最后你便会学会如何从本地代码调用JS代码了。

现在让我们开始!本机使用的Mac OS X作为开发环境。

步骤1. 用Cocos2dx-js模板创建新项目,同时新建一个即将绑定至JS的C++类。

将项目命名为“JSBinding”然后点击“Next”、“ Create”

新建一个类然后实现这个类,等会再将其绑定至JS。

按“command+N”新建一个C++类并命名为“JSBinding”,路径为“OS X\C and C++\C++ Class”。

将以下代码添加到“JSBinding.h”文件中。

#include "cocos2d.h"

#include "ScriptingCore.h"

// Define a namespace to manage your code and make your code clearly

namespace JSB {

class JSBinding: public cocos2d::CCObject

{

public:

static cocos2d::CCScene* scene();

virtual bool init();

CREATE_FUNC(JSBinding);

void functionTest();

};

}

现在实现JSBinding.cpp中的类。如下所示:

bool JSB::JSBinding::init(){

bool bRef = false;

do{

cocos2d::CCLog("JSB init...");

bRef = true;

} while (0);

return bRef;

}

void JSB::JSBinding::functionTest(){

cocos2d::CCLog("Function test...");

}

步骤2. 将C++代码绑定至Java脚本代码

按“command+N”新建C++类,然后命名“JSB_AUTO”路径“OS X\C and C++\C++ Class”。

往“JSB_AUTO.h”文件中增加一些代码

#include "jsapi.h"

#include "jsfriendapi.h"

#include "ScriptingCore.h"

#include "JSBinding.h"

void register_all(JSContext* cx, JSObject* obj);

然后注意“JSB_AUTO.cpp”的实现。

#include "jsapi.h"

#include "jsfriendapi.h"

#include "ScriptingCore.h"

#include "JSBinding.h"

void register_all(JSContext* cx, JSObject* obj);

然后注意“JSB_AUTO.cpp”的实现。

#include "cocos2d.h"

#include "cocos2d_specifics.hpp"

// Binding specific object by defining JSClass

JSClass* jsb_class;

JSObject* jsb_prototype;

// This function is mapping the function “functionTest” in “JSBinding.cpp”

JSBool js_functionTest(JSContext* cx, uint32_t argc, jsval* vp){

JSBool ok = JS_TRUE;

JSObject* obj = NULL;

JSB::JSBinding* cobj = NULL;

obj = JS_THIS_OBJECT(cx, vp);

js_proxy_t* proxy = jsb_get_js_proxy(obj);

cobj = (JSB::JSBinding* )(proxy ? proxy-ptr : NULL);

JSB_PRECONDITION2(cobj, cx, JS_FALSE, "Invalid Native Object");

if (argc == 0) {

cobj-functionTest();

JS_SET_RVAL(cx, vp, JSVAL_VOID);

return ok;

}

JS_ReportError(cx, "Wrong number of arguments");

return JS_FALSE;

}

JSBool js_constructor(JSContext* cx, uint32_t argc, jsval* vp){

cocos2d::CCLog("JS Constructor...");

if (argc == 0) {

JSB::JSBinding* cobj = new JSB::JSBinding();

cocos2d::CCObject* ccobj = dynamic_castcocos2d::CCObject*(cobj);

if (ccobj) {

ccobj-autorelease();

}

TypeTestJSB::JSBinding t;

js_type_class_t* typeClass;

uint32_t typeId = t.s_id();

HASH_FIND_INT(_js_global_type_ht, typeId, typeClass);

assert(typeClass);

JSObject* obj = JS_NewObject(cx, typeClass-jsclass, typeClass-proto, typeClass-parentProto);

JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));

js_proxy_t* p = jsb_new_proxy(cobj, obj);

JS_AddNamedObjectRoot(cx, p-obj, "JSB::JSBinding");

return JS_TRUE;

}

JS_ReportError(cx, "Wrong number of arguments: %d, was expecting: %d", argc, 0);

return JS_FALSE;

}

// This function is mapping the function “create” when using JavaScript code

JSBool js_create(JSContext* cx, uint32_t argc, jsval* vp){

cocos2d::CCLog("js is creating...");

if (argc == 0) {

JSB::JSBinding* ret = JSB::JSBinding::create();

jsval jsret;

do{

if (ret) {

js_proxy_t* proxy = js_get_or_create_proxyJSB::JSBinding(cx, ret);

jsret = OBJECT_TO_JSVAL(proxy-obj);

}

else{

jsret = JSVAL_NULL;

}

} while(0);

JS_SET_RVAL(cx, vp, jsret);

return JS_FALSE;

}

JS_ReportError(cx, "Wrong number of arguments");

return JS_FALSE;

}

void js_finalize(JSFreeOp* fop, JSObject* obj){

CCLOGINFO("JSBindings: finallizing JS object %p JSB", obj);

}

// Binding JSB type

void js_register(JSContext* cx, JSObject* global){

jsb_class = (JSClass *)calloc(1, sizeof(JSClass));

jsb_class-name = "JSBinding";

jsb_class-addProperty = JS_PropertyStub;

jsb_class-delProperty = JS_PropertyStub;

jsb_class-getProperty = JS_PropertyStub;

jsb_class-setProperty = JS_StrictPropertyStub;

jsb_class-enumerate = JS_EnumerateStub;

jsb_class-resolve = JS_ResolveStub;

jsb_class-convert = JS_ConvertStub;

jsb_class-finalize = js_finalize;

jsb_class-flags = JSCLASS_HAS_RESERVED_SLOTS(2);

static JSPropertySpec properties[] = {

{0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER}

};

// Binding functionTest function

static JSFunctionSpec funcs[] = {

JS_FN("functionTest", js_functionTest, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE),

JS_FS_END

};

// Binding create() function

static JSFunctionSpec st_funcs[] = {

JS_FN("create", js_create, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE),

JS_FS_END

};

// Binding constructor function and prototype

jsb_prototype = JS_InitClass(

cx, global,

NULL,

jsb_class,

js_constructor, 0,

properties,

funcs,

NULL,

st_funcs);

JSBool found;

JS_SetPropertyAttributes(cx, global, "JSB", JSPROP_ENUMERATE | JSPROP_READONLY, found);

TypeTestJSB::JSBinding t;

js_type_class_t* p;

uint32_t typeId = t.s_id();

HASH_FIND_INT(_js_global_type_ht, typeId, p);

if (!p) {

p = (js_type_class_t* )malloc(sizeof(_js_global_type_ht));

p-type = typeId;

p-jsclass = jsb_class;

p-proto = jsb_prototype;

p-parentProto = NULL;

HASH_ADD_INT(_js_global_type_ht, type, p);

}

}

// Binding JSB namespace so in JavaScript code JSB namespce can be recognized

void register_all(JSContext* cx, JSObject* obj){

jsval nsval;

JSObject* ns;

JS_GetProperty(cx, obj, "JS", nsval);

if (nsval == JSVAL_VOID) {

ns = JS_NewObject(cx, NULL, NULL, NULL);

nsval = OBJECT_TO_JSVAL(ns);

JS_SetProperty(cx, obj, "JSB", nsval);

}

else{

JS_ValueToObject(cx, nsval, ns);

}

obj = ns;

js_register(cx, obj);

}

现在已经完成了大部分工作,但是我们需要在“SpiderMonkey”进行注册。

打开“AppDelegate.cpp”增加以下代码

ScriptingCore* sc = ScriptingCore::getInstance();

sc-addRegisterCallback(register_all); //add this line

步骤3. 内存管理

在register_all函数前增加两个新函数。

JSBool JSB_cocos2dx_retain(JSContext* cx, uint32_t argc, jsval *vp){

JSObject* thisObj = JS_THIS_OBJECT(cx, vp);

if (thisObj) {

js_proxy_t* proxy = jsb_get_js_proxy(thisObj);

if (proxy) {

((CCObject* )proxy-ptr)-retain();

CCLog("Retain succeed!");

return JS_TRUE;

}

}

JS_ReportError(cx, "Invaild native object");

return JS_FALSE;

}

JSBool JSB_cocos2dx_release(JSContext* cx, uint32_t argc, jsval *vp){

JSObject* thisObj = JS_THIS_OBJECT(cx, vp);

if (thisObj) {

js_proxy_t* proxy = jsb_get_js_proxy(thisObj);

if (proxy) {

((CCObject* )proxy-ptr)-release();

CCLog("Release succeed!");

return JS_TRUE;

}

}

JS_ReportError(cx, "Invaild native object");

return JS_FALSE;

}

在register_all函数中增加以下代码:

JS_DefineFunction(cx, jsb_prototype, "retain", JSB_cocos2dx_retain, 0, JSPROP_READONLY | JSPROP_PERMANENT);

JS_DefineFunction(cx, jsb_prototype, "retain", JSB_cocos2dx_release, 0, JSPROP_READONLY | JSPROP_PERMANENT);

步骤4. 使用C++代码回调Java脚本代码

在C++代码回调Java脚本代码之前增加一些代码至“hello.js”文件。

var testJSB = new JSB.JSBinding();

testJSB.callback = function(i, j){

log("JSB Callback" + i + j);

};

然后打开“JSBinding.cpp”在“functionTest”中增加一些代码。

js_proxy_t* p = jsb_get_native_proxy(this);

jsval retval;

jsval v[] = {

v[0] = UINT_TO_JSVAL(32),

v[1] = UINT_TO_JSVAL(88)

};

ScriptingCore::getInstance()-executeFunctionWithOwner(OBJECT_TO_JSVAL(p-obj),

"callback", 2, v, retval);

使用“executeFunctionWithOwner()”函数简化函数调用程序

步骤5. 绑定测试

在“hello.js”文件中增加以下代码。

var testJSB = new JSB.JSBinding();

testJSB.retain();

testJSB.functionTest();

testJSB.release();

步骤6. 现在取出(check out)项目

如果你的绑定程序正确无误,将会在调试窗口看到如下界面:

恭喜你成功将JS绑定至本地代码!

C语言数据传递到JavaScript

js是在前台浏览器运行?可以把数据写入一个文本文件,js异步读取这个文本文件。


本文题目:c到javascript的简单介绍
URL分享:http://cqcxhl.cn/article/dsejpei.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP